Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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

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

Код:

#ifndef  #endif #extern

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

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

Последний раз редактировалось Golovastik; 03.03.2010 в 20:25.
Golovastik вне форума   Ответить с цитированием
Старый 03.03.2010, 23:12   #2
p51x
Профессионал
 
Регистрация: 15.02.2010
Сообщений: 11,740
Репутация: 1932

icq: 216409213
По умолчанию

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

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

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

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

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

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

#endif

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

Можно на минимальном коде приветси пример?
Код:

 _MY_HEADER_H_

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

Внесу поправочку:
Хедер подключается всегда 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 в 23:58.
pu4koff вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


20:33.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru