13

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

从网上我发现这是为了防止一次又一次地包含文件,但标题保护如何保证这一点。

4

2 回答 2

24

保护头(或更传统的“包含保护”)是为了防止头文件被多次包含时出现问题;例如

#ifndef MARKER
#define MARKER
// declarations 
#endif

这个文件第一次被#include-ed 时,MARKER预处理器符号将是未定义的,因此预处理器将定义该符号,并且以下声明将包含在编译器看到的源代码中。在随后#include的 's 中,MARKER将定义符号,因此#ifnde/中的所有内容都#endif将被预处理器删除。

为了使其正常工作,每个可能被-edMARKER的头文件的符号需要不同。#include

这种事情之所以必要,是因为在 C/C++ 中,在一个编译单元中多次定义同名的类型或函数是非法的。守卫允许您访问#include头文件而不必担心是否已经包含在内。如果没有保护,同一头文件的多个包含将导致不必要的重新声明和编译错误。这在头文件需要#include其他头文件时特别有用。


简而言之,它不会阻止#include一次又一次地 -ing 文件。相反,它允许您执行此操作而不会导致编译错误

于 2010-06-05T06:20:48.567 回答
2

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

一个例子是结构。即使第二个定义相同,您也无法重新定义结构。因此,如果您尝试编译以下内容:

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

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

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

于 2010-06-05T06:56:01.150 回答