分类: C/C++
2009-07-02 22:31:58
一、关键字:#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
#include
而macro.h有:
#include
现在可以发现我们在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按照被包含头文件的文件名进行取名,以避免由于其他头文件使用相同的符号而引起的冲突。
chinaunix网友2011-04-19 17:00:43
可是我写了一个很简单的验证程序,a.h就包括一句"int n",b.h和c.h都只包含了a.h.然后d.c同时包含b.h c.h可是编译通过,而且运行也没问题.我在win下写的,难道这个和平台有关?还是其他的什么
chinaunix网友2011-04-11 21:49:05
你好,对这个头文件被包含的错误,我想问一句,多次包含同一个头文件有什么错误呢?[我知道怎么防止多次包含,但是不知道为什么要防止 - _-||]