今天下午遇到一个头文件相互包含而导致的编译问题花了我不少时间去调试没找到问题,最后晚上跟师兄讨论不少时间突然有所顿悟!
那么,现在另有两个源文件
整個项目会分别编译这两个源文件编译完之后会报错,大致意思是 ClassA 和 VAR_MACRO 没有定义那么问题就比较奇怪了,每个头文件都分别引用了另一个頭文件为什么会出现未定义呢?
我们都知道 C/C++ 中头文件开始习惯使用 #ifndef ... #define ... #endif
这样的一组预处理标识符来防止重复包含例如上面的问题中我也使鼡了,如果不使用的话两个头文件相互包含,就出现递归包含这个很好理解就不多叙。
回到问题本身我在微博上贴出了这个,有人說在 head1.h
的函数前加上 ClassA A;
的前置声明至于为什么要加,估计很多人都没理解...
这时问题就很清楚了func 函数声明之前并没有发现 ClassA 类型定义,该定义茬函数声明的后面这时候如果能在head1.h
的函数声明之前加上 ClassA CA;
的前置声明,就不会在编译的时候报找不到
ClassA 的定义的错误了
现在回头想想这个問题,其实是个非常简单的头文件包含的问题如果了解一些编译器的预编译过程,错误原理也很简单但为什么我卡在这个问题很长时間,原因有以下几点:
- 问题出现在一个项目的编译过程中未能准确地定位问题的原因
- 出现问题,没有静下来心来理清问题C/C++ 编译基础知識点虽然知道,但未能第一时间运用到该问题的分析上
- 师兄说加上前置类的声明确实解决了类类型找不到的错误,虽然有问题解决方法但没有真正理解这种做法的道理,以至于宏定义找不到的错误还是不知如何去解决(其实本质是一样的)
总的来说遇到问题不要慌,保持大脑清醒把加一行或减一行代码期望就能碰运气编译通过的时间拿来分析问题更有效,解决问题之后一定确定自己是否知其然亦知其所以然!
Google找了一圈没找到有价值的资料....