2010-06-05 39 views
8

在C++中,C++程序中头文件保护的目的是什么。头文件保护的目的

从网络我发现这是为了防止包括一次又一次的文件,但如何保证头部卫队。

+0

在C++中接受的术语是“包含警卫”。 – 2011-04-04 07:49:30

+0

维基百科给出了[很好的解释](http://en.wikipedia.org/wiki/Include_guard)如何包括警卫的工作。 – 2010-06-05 06:18:55

回答

14

如果头文件被多次包含,则防护标头可防止出现问题;例如

#ifndef MARKER 
#define MARKER 
// declarations 
#endif 

第一次这个文件是#include -ed,所述MARKER预处理器符号是未定义的,那么预处理器将定义符号,下面的声明将包括在由编译器看到的源代码。在随后的#include's上,MARKER符号将被定义,因此预处理器将删除在#ifnde/#endif内的所有内容。

为使此功能正常工作,对于每个可能为#include -ed的头文件,MARKER符号需要不同。

这种事情的必要性是因为在编译单元中多次定义一个具有相同名称的类型或函数在C/C++中是非法的。守卫允许一个头文件到#include其他头文件,而不用担心这可能会导致一些声明被包含多次。


总之,它不防止#include连连-ing的文件。相反,它允许你你这样做而不会导致编译错误

2

标题保护的目的是防止某些代码每个翻译单元只能出现一次的问题。

一个例子是一个结构。即使第二个定义完全相同,也不能重新定义结构。因此,如果您尝试编译以下代码:

struct foo { int x; }; 
struct foo { int x; }; 

由于重新定义,编译器将失败。

可能很难保证您只包含一次头(当头包含其他头时会发生这种情况)。如果你的头文件有结构定义,这将导致编译失败。标题守卫是一个简单的技巧,所以即使标题被多次包含,它的内容也只会出现一次。