Когда не использовать include guard в заголовочном файле? - PullRequest
17 голосов
/ 22 июля 2011

Мы все знаем, когда использовать include guard, но когда мы не будем использовать его в нашем проекте?

Недавно я видел проект со смешанной компиляцией (CUDA + GCC), один заголовочный файл (файл CUDA) намеренно оставлен без include guard. Мне просто интересно об этом.

Ответы [ 4 ]

13 голосов
/ 22 июля 2011

У меня в голове 2 сценария:

  1. , когда вы хотите включить / отключить возможности отладки (как работает assert.h)
  2. для 'x-macro' тип функциональности, где у вас есть включаемый файл, выполняющий 2 части задачи, например, определение перечисления, а затем определение массива строковых имен, соответствующих перечислениям
3 голосов
/ 22 июля 2011

Один случай, когда вы хотите включить один и тот же файл несколько раз с разными параметрами. В этом случае включаемый файл будет действовать как своего рода шаблон. Примером являются Scalers на Dosbox.

2 голосов
/ 17 сентября 2015

В наших проектах мы никогда не используем include guard. Мы используем антигвардейский:

#ifndef _stdafx_h_
#define _stdafx_h_
#else
#error reinclude stdafx.h
#endif

Потому что, если вы включили тот же заголовок - вы написали неверный код или работали с неверной архитектурой.

0 голосов
/ 22 июля 2011

Включение защиты используется для того, чтобы файл включения мог быть включен несколько раз в одном модуле компиляции, не приводя к дублированию объявлений.

Не используйте включения защиты, когда файл должен быть включен несколько раз в одноммодуль компиляции, и это не приводит к дублированию объявлений.

...