|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
03.03.2010, 19:17 | #1 |
Заблокирован
Регистрация: 25.05.2009
Сообщений: 284
|
#ifndef #endif #extern
Код:
без них обходился и раньше, но в чужом коде их увидел. Как они работают? . Можно на примере 2) На Билдере и Делфи есть такое понятие компонент. Компонент - это класс, др. словами? Последний раз редактировалось Golovastik; 03.03.2010 в 19:25. |
03.03.2010, 22:12 | #2 |
Старожил
Регистрация: 15.02.2010
Сообщений: 15,758
|
Смотри в справке (например, в МСДН).
Про "#extern" - вы уверены, что это деректива, а не просто ключевое слово? |
03.03.2010, 22:17 | #3 |
Заблокирован
Регистрация: 25.05.2009
Сообщений: 284
|
Да, extern - это не директива, а что нибудь другое.
А про #ifndef #endif я так и не понял что означает, вроде читал чтоб не дублировать инклюиды, которые мы прописали, а как именно это происходит немного не ясно. |
03.03.2010, 22:29 | #4 |
Пользователь
Регистрация: 20.02.2010
Сообщений: 27
|
#ifndef - это ацки просто) это директива которая проверяет определено ли данное имя. если имя НЕ определенно (if-not-definition), то следующий за директивой код "подключаеться" к проэкту (он как бы не игнорируеться) до директивы #endif
а используют это вот как: #ifndef _MY_HEADER_H_ //имя подбираете такое что точно не было до этого, но и не от фанаря. #define _MY_HEADER_H_ // и в первой же строчке определяем это имя, как видно тут это имя ничего не определяет. /////тут сам ваш хедер #endif но главное что это очень просто позволяет только ОДИН раз подключаться ваш хедер. |
03.03.2010, 22:52 | #5 |
Заблокирован
Регистрация: 25.05.2009
Сообщений: 284
|
Можно на минимальном коде приветси пример?
Код:
|
03.03.2010, 22:53 | #6 |
Старожил
Регистрация: 22.05.2007
Сообщений: 9,085
|
Внесу поправочку:
Хедер подключается всегда 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 файле уже создаст эту переменную. Я собственно на похожие темы отписывался на форуме, можете поиском посмотреть, может там я более доходчиво это дело объяснил Его уже привел Вам ZigaZaga. Минимальнее некуда. Да там собственно больше и нечего добавить Нет. Вместо этого может быть что угодно, вписывающееся в синтаксис языка. Хоть ФИО своё там транслитом вбухайте. Важно только, чтобы это имя было уникальным в пределах проекта, иначе будет трудноуловимая ошибка Последний раз редактировалось pu4koff; 03.03.2010 в 22:58. |