Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.03.2010, 19:17   #1
Golovastik
Заблокирован
 
Регистрация: 25.05.2009
Сообщений: 284
По умолчанию #ifndef #endif #extern

Код:
#ifndef  #endif #extern
Как применять эти директивы и зачем они?
без них обходился и раньше, но в чужом коде их увидел.
Как они работают? . Можно на примере

2) На Билдере и Делфи есть такое понятие компонент. Компонент - это класс, др. словами?

Последний раз редактировалось Golovastik; 03.03.2010 в 19:25.
Golovastik вне форума Ответить с цитированием
Старый 03.03.2010, 22:12   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Смотри в справке (например, в МСДН).
Про "#extern" - вы уверены, что это деректива, а не просто ключевое слово?
p51x на форуме Ответить с цитированием
Старый 03.03.2010, 22:17   #3
Golovastik
Заблокирован
 
Регистрация: 25.05.2009
Сообщений: 284
По умолчанию

Да, extern - это не директива, а что нибудь другое.
А про #ifndef #endif я так и не понял что означает, вроде читал чтоб не дублировать инклюиды, которые мы прописали, а как именно это происходит немного не ясно.
Golovastik вне форума Ответить с цитированием
Старый 03.03.2010, 22:29   #4
ZigaZaga
Пользователь
 
Регистрация: 20.02.2010
Сообщений: 27
По умолчанию

#ifndef - это ацки просто) это директива которая проверяет определено ли данное имя. если имя НЕ определенно (if-not-definition), то следующий за директивой код "подключаеться" к проэкту (он как бы не игнорируеться) до директивы #endif

а используют это вот как:

#ifndef _MY_HEADER_H_ //имя подбираете такое что точно не было до этого, но и не от фанаря.
#define _MY_HEADER_H_ // и в первой же строчке определяем это имя, как видно тут это имя ничего не определяет.

/////тут сам ваш хедер

#endif

но главное что это очень просто позволяет только ОДИН раз подключаться ваш хедер.
ZigaZaga вне форума Ответить с цитированием
Старый 03.03.2010, 22:52   #5
Golovastik
Заблокирован
 
Регистрация: 25.05.2009
Сообщений: 284
По умолчанию

Можно на минимальном коде приветси пример?
Код:
 _MY_HEADER_H_
Такое обязательно дожно идти?
Golovastik вне форума Ответить с цитированием
Старый 03.03.2010, 22:53   #6
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,520
По умолчанию

Внесу поправочку:
Хедер подключается всегда n раз, где n - количество его include. Эти манипуляции с препроцессором никак не связаны с подключением хедера.
Чтобы понять как это дело работает, нужно представлять как компилируется проект.
На вход подаются только cpp-файлы. Про хедеры компилятор изначально ничего не знает. Единица компиляции - один cpp файл. Между компиляцией разных cpp файлов компилятор всё "забывает". Он не помнит ни определенные через #define имена, ни уже подключенные хедеры. Каждый файлик заново обрабатывает, как-будто его впервые видит. Директива #include тупо вставляет содержимое прописанного там файла, т.е. в итоге компилятор получит не кучу мелких хедеров и один cpp, а слепленные в один все эти файлы.
Теперь собственно как работает #ifndef ... #endif. При первом подключении хедера, имя, описанное после #ifndef не определено, соответственно вместо #include вставится всё, что находится между #ifndef и #endif, в том числе сработает и #define, который определит нужное имя. При повторном включении хедера, уже #ifndef не сработает, т.е. всё, что между #ifndef и #endif компилятор не получит, а это собственно весь код хедера. В итоге во второй раз хедер успешно подключится, только вот это будет пустая строка. Не зря я упоминал про единицы компиляции, т.к. под повторным включением тут подразумевается включение одного и того же хедера в один и тот же cpp файл. Для другого cpp файла #ifndef так же сработает один раз и у него в итоге будет своя копия хедера. В общем, каждый cpp файл в итоге скомпонуется со своими копиями хедеров. Если в хедере описана переменная без ключевого слова extern, то у каждого cpp файла будет свой экземпляр переменной, что приведет к трудно уловимой ошибке. Поэтому все глобальные переменные нужно описывать в хедерах исключительно с ключевым словом extern (extern int a, а "реализовывать" уже в каком-нибудь одном cpp файле по обычному сценарию (int a. extern в данном случае будет говорить, что где-то есть целочисленная переменная а, а описание переменной в cpp файле уже создаст эту переменную.
Я собственно на похожие темы отписывался на форуме, можете поиском посмотреть, может там я более доходчиво это дело объяснил

Цитата:
Сообщение от Golovastik Посмотреть сообщение
Можно на минимальном коде приветси пример?
Его уже привел Вам ZigaZaga. Минимальнее некуда. Да там собственно больше и нечего добавить
Цитата:
Сообщение от Golovastik Посмотреть сообщение
Код:
 _MY_HEADER_H_
Такое обязательно дожно идти?
Нет. Вместо этого может быть что угодно, вписывающееся в синтаксис языка. Хоть ФИО своё там транслитом вбухайте. Важно только, чтобы это имя было уникальным в пределах проекта, иначе будет трудноуловимая ошибка

Последний раз редактировалось pu4koff; 03.03.2010 в 22:58.
pu4koff вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск