Почему каждый файл .h начинается с #ifndef #define #endif? Мы можем скомпилировать программу без этих директив.В C и C++, почему каждый файл .h обычно окружен директивами #ifndef #define #endif?
ответ
Это так называемый «охранник». Цель состоит в том, чтобы предотвратить многократное анализирование файла, если он включен несколько раз.
И предотвратить множественные определения одного и того же класса. – James
Была ли когда-либо директива #import, или это просто мое воображение? –
@Autopulated: Это то, что он подразумевает, получив парсинг несколько раз. Есть больше вещей, чем переопределение классов, о которых нужно беспокоиться; все они инкапсулируются «множественным разбором». – GManNickG
Он называется охранником. Вы можете писать без них до тех пор, пока не начнете писать большие программы и не узнаете, что вам нужно включить тот же .h-файл более одного раза, прямо или косвенно, из файла .c. Тогда без включения защитников вы получите несколько ошибок определения, но с ними содержимое заголовка анализируется только один раз и пропускает все последующие времена, избегая этих ошибок. Это хорошая практика, чтобы всегда использовать их.
Он предотвращает множественные включения одного файла. То же самое можно сделать с помощью
#pragma once
директиву, но эти #ifndefs являются стандартными, таким образом, поддерживается каждым компилятором.
#pragma один раз. Является специфическим расширением для компилятора. –
... но широко поддерживается, чтобы быть справедливым –
Если заголовочный файл содержит определение типа
int i;, то, будучи включенным несколько раз без охраны, выдается ошибка компиляции.
ifndef проверяет, что некоторая переменная препроцессора не определена (и это не первый раз), а затем явно определяет ее, чтобы избежать повторного захвата. В MSVC вы также можете использовать
#pragma onceвместо
ifndef
.
Если я правильно понимаю, вы хотите знать, может ли в отсутствие включения охранников включать заголовочный файл несколько раз, вызывая ошибку или опасное поведение. Это после исключения нескольких определений и т. Д.
Представьте себе вредоносного программиста, в заголовочном файле которого нет защитных устройств. Его заголовочный файл определяет один макрос, SZ
, который является размером, который вы используете для ваших статически распределенных массивов. Программист может написать свой заголовочный файл, как это:
#ifndef SZ
#define SZ 1024
#else
#if SZ == 1024
#undef SZ
#define SZ 128
#else
#error "You can include me no more than two times!"
#endif
#endif
Теперь, если включить заголовочный файл один раз, вы получите SZ
равное 1024. Если включить его в два раза, SZ
становится 128. Конечно, большинство в реальном масштабе мировые программисты не являются злонамеренными, и никто на самом деле не пишет такой код, как описано выше.
Обратите внимание, что стандарт C позволяет assert.h
быть #include
д больше, чем один раз различное поведение в зависимости от того, является ли NDEBUG
определяется в момент включения assert.h
. Таким образом, assert.h
не может включать в себя охранники. Это особенность, а не ошибка.
- 1. Лучшая практика в файлах заголовков C с #ifndef #define #endif
- 2. Почему #ifndef и #define используются в файлах заголовков C++?
- 3. #ifdef/#ifndef и #endif
- 4. C++ #ifndef ЗНАК #define ЗНАК
- 5. Почему #endif включен в конце страницы .h?
- 6. Использует #ifndef и #define в C++ устаревшим?
- 7. C++ классы, путаница в правилах #ifdef, #define и #endif
- 8. C++ о исходном коде Intel PCM #ifndef INTELPCM_API #define INTELPCM_API #endif
- 9. Зачем использовать #ifndef CLASS_H и #define CLASS_H в файле .h, но не в .cpp?
- 10. C macro/# define indentation?
- 11. Назначение #ifndef FILENAME .... # endif в файле заголовка
- 12. Новый файл .h в Eclipse дает константу #define
- 13. Почему код между ifndef/endif все еще запущен?
- 14. Включите гвардию и #ifndef #define Preprocessing заявления
- 15. Вложенная структура Typedef в объединении, .c и .h-файл
- 16. C++ .h и .cpp файл отдельно
- 17. Как я могу написать .h headerfile C и C++
- 18. #define, #ifdef #undef #endif
- 19. Проблемы с #ifndef в C++
- 20. Зацикливание над конструкциями ifndef/endif в Makefile
- 21. Код ANSI C для кода Objective-C и C++?
- 22. Использование define в файле заголовка c
- 23. Почему заголовочный файл Head1.h не содержит заголовочный файл Head2.h, который включает Head1.h?
- 24. Использует ли #ifndef и #define значение распределения памяти?
- 25. нужны разъяснения по #ifndef #define
- 26. Получение «ошибки C2011:« TextureManager »: ошибка переопределения типа« класс ». #ifndef #define #endif в файлах
- 27. C++/аргументы в h. файл
- 28. несовместимо # если/# endif пара в * .h файле
- 29. Добавить заголовок #ifndef в файлы заголовков C в текущем каталоге
- 30. C header file #ifndef #include error
Google «включить охранников» –