C ++ включает охрану - PullRequest
       58

C ++ включает охрану

4 голосов
/ 13 декабря 2011

Итак, я знаю, как разместить охрану включения в моих собственных заголовочных файлах со стандартом

#ifndef ...
#define ...

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

foo.h

#ifndef FOO_H
#define FOO_H

#include <string>

... code etc ...

#endif

Теперь, если у меня есть другой файл заголовка с именем .. скажем, bar.h, который ТАКЖЕ требует использования <string>, как я могу предотвратить множественные включения?У STL уже есть охранники?

Ответы [ 3 ]

9 голосов
/ 13 декабря 2011

Библиотека STL также включает в себя охрану, и любая хорошая библиотека должна делать то же самое.

#ifndef _GLIBCXX_STRING
#define _GLIBCXX_STRING 1

Это из GCC's

5 голосов
/ 13 декабря 2011

Предполагая, что под "STL" вы подразумеваете стандартную библиотеку C ++, вы можете ссылаться на стандарт C ++.§17.6.2.2/2 состояния:

Модуль перевода может включать заголовки библиотеки в любом порядке.Каждый может быть включен более одного раза, без эффекта, отличного от включенного ровно один раз, за ​​исключением того, что эффект включения <cassert> или <assert.h> зависит каждый раз от лексически текущего определения NDEBUG.

Это означает, что нет необходимости защищать от нескольких включений одного и того же заголовка.

3 голосов
/ 13 декабря 2011

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

...