为什么每个.h文件都以#ifndef #define #endif开头?我们当然可以在没有这些指令的情况下编译程序。在C和C++中,为什么每个.h文件通常被#ifndef #define #endif指令包围?
回答
它被称为包括警卫。直到开始编写大型程序并发现需要从.c文件中直接或间接多次包含相同的.h文件时,才能编写它们。然后,如果没有包含警卫,你会得到多个定义错误,但是对于他们来说,头文件内容只被解析一次,并跳过所有后续时间,避免这些错误。总是使用它们是一种很好的做法。
它可以防止单个文件的多个包含。同样可以使用
#pragma once
指令来完成,但是那些#ifndefs是标准因此由每个编译器的支持。
#pragma一次。是编译器特定的扩展。 – 2010-01-10 21:32:28
......但得到广泛支持的一个,公平 – 2010-01-11 07:58:28
如果一个头文件包含像
int i;这样的定义而不包含多次,那么将会产生一个编译错误。
ifndef检查某个预处理器变量没有被定义(并且它不是第一次),然后明确地定义它以避免被再次捕获。 在MSVC中,您也可以使用
#pragma once而不是
ifndef
's。
如果我理解正确,您想知道是否在没有包含警卫的情况下可以多次包含头文件导致错误或危险行为。这是在排除多个定义之后等。
想象一下,恶意程序员的头文件没有包含防护。他的头文件定义了一个宏,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
不能包含警卫。虽然这是一个功能,而不是一个错误。
谷歌“包含卫兵” – 2010-01-10 21:14:22