这是用来防止重复包含头文件而引起的错误的,例如,有如下几个文件
之前先明确一点,编译器只编译源文件,而不编译头文件
//a.h
class A{};//定义了一个类
//b.h
#include "a.h"
//main.cpp
#include "a.h"
#include "b.h"
int main()
{
return 0;
}
那么编译的时候就会出现类A重复定义的错误
为什么呢?因为编译之前,预处理器会将main.cpp中的内容根据#include展开
那么这个例子中的main.cpp展开之后就成了
//main.cpp
class A{};//从a.h中展开
class A{};//从b.h展开,因为b.h中#include "a.h"
int main()
{
return 0;
}
因此就出现了A的重定义错误
若是改成
//a.h
#ifndef H_A
#define H_A
class A{};
#endif
//b.h
#ifndef H_B
#define H_B
#include "a.h"
#endif
那么main.cpp展开之后就成了
#ifndef H_A
#define H_A
class A{};
#endif
#ifndef H_B
#define H_B
#ifndef H_A
#define H_A
class A{};
#endif
#endif
int main()
{
return 0;
}
因为第二个class A{};之前已经定义了H_A宏,因此编译器将不再编译
#define H_A
class A{};
这两句,因此也就没有了A的重定义问题
其实真正经过预处理之后的代码并没有#define之类的宏,我只是觉得这样容易理解,把本应该在预处理阶段处理的内容留到了编译阶段
[此贴子已经被作者于2006-11-5 10:42:51编辑过]