2011-12-13 78 views
3

所以我知道如何把一个包括后卫在自己的头文件与标准C++包括后卫

#ifndef ... 
#define ... 

现在,我的问题是关于包括不属于我自己的库。将是一个很好的例子。我有需要使用字符串的头文件,所以我下面

foo.h中

#ifndef FOO_H 
#define FOO_H 

#include <string> 

... code etc ... 

#endif 

现在,如果我有一个称为另一头文件..让说,bar.h,这也需要使用<string>,我该如何防止多种夹杂物? STL是否已包含警卫?

回答

8

STL图书馆也有包括警卫和任何好的图书馆都应该这样做。

#ifndef _GLIBCXX_STRING 
#define _GLIBCXX_STRING 1 

这是gcc的

+0

微软使用'#pragma once' - 它们专有的标头卫士版本。这很好:“STL”现在是编译器的一部分,因此可以使用特定于编译器的语言扩展。 – MSalters

3

包括后卫使用看守警卫对里面的内容。你可以检查系统头文件string,它也有包括后卫。所以,不要担心多个包含物。

4

假设“STL”表示C++标准库,那么您可以参考C++标准。 §17.6.2.2/2指出:

翻译单元可以以任何顺序包括库标题。除了包含<cassert><assert.h>的效果每次都取决于NDEBUG的词汇当前定义之外,每个可以包含多次,没有任何效果与仅包含一次不同。

这意味着没有必要防止同一标题的多个内含物。