对于小工具程序而言,用c++编写估计也就几个文件,此时很少设计头文件互相包含引发的编译出错问题。
但是当软件功能越来越多,功能越来越复杂,各模块之间的调用关系也越来越不明显,此时很有可能会出现一头文件包含B头文件,B头文件包含一个头文件的情况,这种互相包含头文件会导致出现找不到编译类型的错误。
最简单的代码如下:
A.h如下
<代码> # include“B.h” A类 { B B; }代码>
A.cpp如下
<代码> # include“A.h” A类 { … }代码>
B.h如下
<代码> # include“A.h” B类 { 一个一个; }代码>
B.cpp如下
<代码> # include“B.h” B类 { … }代码>
如果文件是上述这种情况,则编译出现找不到类型,因为头文件中一个包含了B头文件,B中又包含了一头文件,这种循环包含会导致编译出错。
<>强解决办法强>
解决办法采用前置声明。
改后代码如下
A.h如下
<代码> B类; A类 { B B; }代码>
A.cpp如下
<代码> # include“A.h” # include“B.h” A类 { … }代码>
B.h如下
<代码> A类 B类 { 一个一个; }代码>
B.cpp如下
<代码> # include“B.h” # include“A.h” B类 { … }代码>
<>强如果想一劳永逸呢? 强>
对于经常用到的模块的头文件,可以统一写一份前置声明文件,将常用的声明都写入这个头文件,比如叫做includeDeclare.h,然后将其实际的头文件都放入一个文件,比如includeHeaders.h中。这样后续其他地方使用的时候,只要在头文件中引入includeDeclare.h,在实现cpp文件中引入includeHeaders.h。