一、下划线“__”属于编程风格的内容,对程序没有影响。不用下划线也可以,用几个下划线也由个人习惯。
二、其实质是一个宏名。由此我们可以防止发生重复定义或声明。
假设你的头文件名为head.h,根据习惯,我们声明一个宏HEAD_H,对应这个头文件,在头文件中开始的地方和结尾的地方加上 对HEAD_H的声明和判断,头文件Head.h如下:
#ifndef HEAD_H
#define HEAD_H
……(头文件内容)
#endif
这样,头文件可以避免被多次包含。头文件中定义的变量不存在重复声明或定义。
一、关键字:#ifndef,#define,#endif可以防止头文件被重复引用
结构是这样的:
如a.h头文件
#ifndef XX
#define XX
// 函数声明
#endif
第一次include这个头文件的时候由于XX还没有被define,所以满足#ifndef XX这个判断
那么执行它下面的内容 #define XX和他下面的函数声明;
如果由于编码者的不小心或者嵌套包含造成了这个头文件被多次引用;那么当编译到第二次#inlude的地方的时候由于不满足 #ifndef XX这个判断条件所以不执行后面的内容(#define XX和函数声明都不走)直接跳到#endif因此可以很好的防止头文件被重复引用
二、现在有一个大型的程序分为很多模块
每个模块中又有很多的函数
这样你肯定不可能知道他的全部函数中的代码
现在假如说
main.c文件中有这们两行代码:
#include<macro.h>
#include<key.h>
而macro.h有:
#include<key.h>
现在可以发现我们在main和macro中重复引用了key.h这样一个头文件
这就叫重复引用
防止重复引用的方法就是在每个头文件中加上ifndef/define/endif条件编译语句
头文件重复引用是指一个头文件在同一个CPP文件中被INCLUDE了多次,这种错误常常是由于INCLUDE 嵌套造成的。比如:
存在a.h文件
#include "dup.h"
.....
b.cpp文件如下
#include "a.h"
#include "dup.h"
....
此时就会造成重复引用。解决方法是在dup.h开头中加上:
#ifndef DUP_H
#define DUP_H
....... //原来DUP.h中的内容
#endif
三、#include文件的一个不利之处在于一个头文件可能会被多次包含,为了说明这种错误,考虑下面的代码:
#include "x.h"
#include "x.h"
显然,这里文件x.h被包含了两次,没有人会故意编写这样的代码。但是下面的代码:
#include "a.h"
#include "b.h"
看上去没什么问题。如果a.h和b.h都包含了一个头文件x.h。那么x.h在此也同样被包含了两次,只不过它的形式不是那么明显而已。
多重包含在绝大多数情况下出现在大型程序中,它往往需要使用很多头文件,因此要发现重复包含并不容易。要解决这个问题,我们可以使用条件编译。如果所有的头文件都像下面这样编写:
#ifndef _HEADERNAME_H
#define _HEADERNAME_H
...
#endif
那么多重包含的危险就被消除了。当头文件第一次被包含时,它被正常处理,符号_HEADERNAME_H被定义为1。如果头文件被再次包含,通过条件编译,它的内容被忽略。符号_HEADERNAME_H按照被包含头文件的文件名进行取名,以避免由于其他头文件使用相同的符号而引起的冲突。
但是,你必须记住预处理器仍将整个头文件读入,即使这个头文件所有内容将被忽略。由于这种处理将减慢编译速度,所以如果可能,应该避免出现多重包含