标题警卫的目的
在C ++中,C ++程序中的头文件保护的目的是什么?
从networking我发现是为了防止包括一次又一次的文件,但如何保证头卫队这一点。
如果头文件不止一次被包含,则头文件将防止问题; 例如
#ifndef MARKER #define MARKER // declarations #endif
第一次这个文件是#include
-ed, MARKER
预处理器符号将是未定义的,所以预处理器将定义符号,以下声明将包含在编译器看到的源代码中。 在随后的#include
,将定义MARKER
符号,因此#ifnde
/ #endif
所有内容都将被预处理器删除。
为了正常工作,对于可能被#include
-ed的每个头文件, MARKER
符号需要不同。
这种事情有必要的原因是在编译单元中多次用同一个名字定义一个types或函数是C / C ++非法的。 守卫允许一个头文件#include
其他头文件,而不用担心这可能会导致一些声明被包含多次。
总之,它并不妨碍你一次又一次地包含一个文件。 相反,它可以让你做到这一点, 而不会导致编译错误 。
标题守卫的目的是防止某些代码每翻译单元只能出现一次的问题。
一个例子是一个结构。 即使第二个定义完全相同,也不能重新定义结构。 所以,如果您尝试编译以下内容:
struct foo { int x; }; struct foo { int x; };
编译器将因重新定义而失败。
可能很难保证一次只包含一个头(当头包含其他头时会发生这种情况)。 如果你的头文件有结构定义,这将导致编译失败。 标题守卫是一个简单的窍门,即使多次包含标题,它的内容也只会出现一次。