首页 > 代码库 > 关于C/C++头文件重复定义的思考

关于C/C++头文件重复定义的思考

1.什么叫重复定义

我们在写大型项目的时候,文件多,关系复杂。往往会引起头文件重复定义的问题。

什么叫头文件重复定义呢?

举个最简单的例子:

有一个头文件"c.h",在"a.h"中存在两次对"c.h"头文件的引用。在"a.h"中有如下语句:

<span style="font-size:18px;">#include "c.h"
#include "c.h"</span>

出现这样的幼稚的错误可能有两种原因,第一种就是你不小心手一抖将"ch.h"少些了。或者是你只是好奇,写了两个。第二种是最不容易察觉到的,就是在调用其他头文件中重复调用了"c.h"。工程中调用错综复杂,不小心调用了两次是很容易发生的。

如"b.h"的头文件中有:

#include "c.h"

"a.h"同时引用了"c.h"和"b.h"即:
#include "b.h"
#include "c.h"

2.如何解决重复定义

解决重复第一个的一个好办法是每一个头文件前都加入#ifndef #define...#endif的宏定义。如头文件"c.h"写成如下形式。

#ifndef C_H
#define C_H
/*
c.h中所有内容,!注意这里是所有内容
*/
#endif</span>

3. 为什么能解决重复定义的问题?

为什么这样做能解决重复引用的问题呢?

比如上面举的第二种情况的例子,“a.h”首先引用"b.h","b.h"中调用”c.h“。第一次没有定义C_H的宏,引用"c.h"成功。第二次引用"c.h"时,由于已经定义了C_H,将不再会引用"c.h"。这样就很好的解决了重复引用的问题。

!注意1 有养成习惯每一个头文件都加这样一个宏定义。

!注意2 宏定义#define C_H下面的内容是原来的"c.h"中所有的内容。

关于C/C++头文件重复定义的思考