解决方法
在每个头文件的最前端和最后端加以下代码
#ifndef __xxx_x //其中__xxx_x为唯一的标志符
#define __xxx_x
...
...
...
#endif
说明
条件编译,解决的是头文件重复包含的问题
比如:
a.h
b.h //这个b.h是包含a.h的
#include “a.h”
#include “b.h”
如果预处理阶段,写成这样,实际上a.h就会插入两次了,编译的时候容易会报错
要想不出现这种情况,可以在a.h里加上条件编译代码
#ifndef __A_H
#define __A_H
… //原来a.h的内容
#endif
原理:在文本插入后,会再做宏的判断
第1次展开
#ifndef __A_H //第1次,会先判断宏是否存在
#define __A_H //如不存在,则创建宏,并引入宏名后的内容(宏体)
//很明显是不存在,条件满足,走
#define
.... //原来a.h的内容
#endif
第2次展开,因为重复定义了,会有下面这个代码
#ifndef __A_H
#define __A_H
.... //原来a.h的内容
#endif //而上面宏已经创建了,条件已经不满足,走#endif后面的代码
总结
示例:
#ifndef x //先测试x是否被宏定义过
#define x
程序段1 //如果x没有被宏定义过,定义x,并编译程序段 1
#endif
程序段2 //如果x已经定义过了则编译程序段2的语句,“忽视”程序段 1
#ifndef #define #endif的作用,相当于当第二次重复展开的时候,不会把a.h里的内容插入到.c的main文件里面,防止头文件的重复包含和编译而导致报错