在C ++中,C ++程序中头文件保护的目的是什么。
从net我发现这是为了一次又一次地防止包含文件,但是头部保护如何保证这一点。
答案 0 :(得分:20)
保护标头(或更常规的“包括保护”)是为了防止头文件被包含多次出现问题; e.g。
#ifndef MARKER
#define MARKER
// declarations
#endif
第一次这个文件是#include
时,MARKER
预处理器符号将是未定义的,因此预处理器将定义符号,并且以下声明将包含在由编译器。在后续#include
上,将定义MARKER
符号,因此预处理器将删除#ifnde
/ #endif
中的所有内容。
为了使其正常工作,MARKER
符号需要针对可能为#include
的每个头文件进行不同的编辑。
这种事情必要的原因是在C / C ++中在编译单元中多次定义具有相同名称的类型或函数是非法的。防护允许头文件到#include
其他头文件,而不必担心这可能导致一些声明被多次包含。
简而言之,它不会阻止来自#include
一次又一次的文件。相反,它允许你执行此操作而不会导致编译错误。
答案 1 :(得分:2)
标题保护的目的是防止某些代码每个翻译单元只出现一次的问题。
一个例子是结构。即使第二个定义相同,也无法重新定义结构。因此,如果您尝试编译以下内容:
struct foo { int x; };
struct foo { int x; };
由于重新定义,编译器将失败。
可能很难保证您只包含一次标头(当标头包含其他标头时会发生这种情况)。如果您的标头具有结构定义,则会导致编译失败。标题保护是一个简单的技巧,所以即使标题被多次包含,它的内容也只出现一次。