标题警卫的目的

在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; }; 

编译器将因重新定义而失败。

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