2010-01-10 1 views

ответ

14

Это так называемый «охранник». Цель состоит в том, чтобы предотвратить многократное анализирование файла, если он включен несколько раз.

+0

И предотвратить множественные определения одного и того же класса. – James

+1

Была ли когда-либо директива #import, или это просто мое воображение? –

+2

@Autopulated: Это то, что он подразумевает, получив парсинг несколько раз. Есть больше вещей, чем переопределение классов, о которых нужно беспокоиться; все они инкапсулируются «множественным разбором». – GManNickG

3

Он называется охранником. Вы можете писать без них до тех пор, пока не начнете писать большие программы и не узнаете, что вам нужно включить тот же .h-файл более одного раза, прямо или косвенно, из файла .c. Тогда без включения защитников вы получите несколько ошибок определения, но с ними содержимое заголовка анализируется только один раз и пропускает все последующие времена, избегая этих ошибок. Это хорошая практика, чтобы всегда использовать их.

4

Он предотвращает множественные включения одного файла. То же самое можно сделать с помощью

#pragma once 

директиву, но эти #ifndefs являются стандартными, таким образом, поддерживается каждым компилятором.

+3

#pragma один раз. Является специфическим расширением для компилятора. –

+0

... но широко поддерживается, чтобы быть справедливым –

-1

Если заголовочный файл содержит определение типа

int i;
, то, будучи включенным несколько раз без охраны, выдается ошибка компиляции.
ifndef проверяет, что некоторая переменная препроцессора не определена (и это не первый раз), а затем явно определяет ее, чтобы избежать повторного захвата. В MSVC вы также можете использовать
#pragma once
вместо ifndef.

1

Если я правильно понимаю, вы хотите знать, может ли в отсутствие включения охранников включать заголовочный файл несколько раз, вызывая ошибку или опасное поведение. Это после исключения нескольких определений и т. Д.

Представьте себе вредоносного программиста, в заголовочном файле которого нет защитных устройств. Его заголовочный файл определяет один макрос, 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 не может включать в себя охранники. Это особенность, а не ошибка.

Смежные вопросы