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