2010-01-10 53 views

回答

14

这是一个所谓的“包括后卫”。其目的是防止文件多次被解析多次。

+0

并防止同一类的多重定义。 – James 2010-01-10 21:17:50

+1

曾经有过#import指令,还是仅仅是我的想象? – 2010-01-10 21:20:31

+2

@Autopulated:这就是他多次解析的意思。除了重新定义类别之外,还有更多的事情需要担心;全部由“多解析”封装。 – GManNickG 2010-01-10 21:21:04

3

它被称为包括警卫。直到开始编写大型程序并发现需要从.c文件中直接或间接多次包含相同的.h文件时,才能编写它们。然后,如果没有包含警卫,你会得到多个定义错误,但是对于他们来说,头文件内容只被解析一次,并跳过所有后续时间,避免这些错误。总是使用它们是一种很好的做法。

4

它可以防止单个文件的多个包含。同样可以使用

#pragma once 

指令来完成,但是那些#ifndefs是标准因此由每个编译器的支持。

+3

#pragma一次。是编译器特定的扩展。 – 2010-01-10 21:32:28

+0

......但得到广泛支持的一个,公平 – 2010-01-11 07:58:28

-1

如果一个头文件包含像

int i;
这样的定义而不包含多次,那么将会产生一个编译错误。
ifndef检查某个预处理器变量没有被定义(并且它不是第一次),然后明确地定义它以避免被再次捕获。 在MSVC中,您也可以使用
#pragma once
而不是 ifndef's。

1

如果我理解正确,您想知道是否在没有包含警卫的情况下可以多次包含头文件导致错误或危险行为。这是在排除多个定义之后等。

想象一下,恶意程序员的头文件没有包含防护。他的头文件定义了一个宏,SZ,这是一个用于静态分配数组的大小。程序员可以编写自己的头文件是这样的:

#ifndef SZ 
#define SZ 1024 
#else 
#if SZ == 1024 
#undef SZ 
#define SZ 128 
#else 
#error "You can include me no more than two times!" 
#endif 
#endif 

现在,如果你包含头文件一次,你SZ等于1024如果包含了两次,SZ变成128。当然,最现实世界程序员不是恶意的,没有人真的写上面的代码。

注意,C标准允许assert.h#include d不止一次与取决于NDEBUG是否在夹杂物的assert.h时定义不同的行为。所以,assert.h不能包含警卫。虽然这是一个功能,而不是一个错误。