Когда не использовать включить охрану в файл заголовка?
Мы все знаем, когда использовать include guard, но когда мы не будем использовать его в нашем проекте?
Недавно я увидел проект с компиляцией микширования (CUDA + GCC), один заголовочный файл (файл CUDA) намеренно оставлен без включения защиты. Мне просто интересно.
Ответы
Ответ 1
С головы: есть 2 сценария:
- когда вы хотите включить/отключить возможности отладки (как работает
assert.h
)
- для 'x-macro' тип функциональности, в котором у вас есть файл include, выполняет две части проблемы, такие как определение перечисления, определяющее массив строковых имен, соответствующих перечислениям
Ответ 2
Один случай, когда вы хотите добавить один и тот же файл несколько раз с разными параметрами. В этом случае включенный файл будет действовать как своего рода шаблон. Примером может служить scalers в Dosbox.
Ответ 3
В наших проектах мы никогда не используем include guard. Мы используем include antiguard:
#ifndef _stdafx_h_
#define _stdafx_h_
#else
#error reinclude stdafx.h
#endif
Потому что, если вы повторно включили один и тот же заголовок - вы написали неправильный код или работали с неправильной архитектурой.
Ответ 4
Включить защитные устройства, чтобы включенный файл мог быть включен несколько раз в одном модуле компиляции, не приводя к двойным объявлениям.
Не используйте include guard, когда файл должен включаться несколько раз в один блок компиляции, и это не приводит к дублированию объявлений.