总的来说,这是一个很傻瓜的错误,但竟然浪费了我一天半的时间~~~~~暴汗,不过,也让我学到好多东西~~~~呵呵,希望各位新手朋友不用犯我这个错误。
这两天写的程序里有个小功能,需要一个从CWinThread继承的线程a和主对话框Dlg进行通讯,在主对话框中需要用到线程a,则我在头文件Dlg.h中 #include “a.h”,而在线程a中,也需要用到主对话框中定义的变量,我便在线程的头文件中加进 #include "Dlg.h" .
然后问题就出现了,在编译的时候,便出现2个错误,指向Dlg.h中定义的线程对象有问题,没有加分号,这肯定是不可能的。在网上查了很久,才发现,原来是陷入了头文件循环嵌套的陷阱,.h文件递归包含了。
比如有2个类,类A和类B ,
在A中,需要用到B所在文件中的变量;在B中,需要用到A所在文件中的变量(当然,有些是可以避免的)
则:
#include "A.h" //在B.h 中
#include "B.h" //在A.h 中
结果出现了.h文件的递归包含,编译时出现错误。错误一般会是不相干的,说少加分号之类。
解决的方法有以下几种:
1. 如果在A中,需要用到类B的对象,我们除了#include "B.h",还可以直接在使用前,再声明一下B
Class B;就可以了。
2.如果只是在A.cpp 中用到B,则可以把#include "B.h" 写在A.cpp 文件中。
3.尽量避免出现两个头文件中互相需要对方定义的变量。
另:
使用include和声明的区别:
前者需要编译构造函数;后者不需要,只是告诉编译器这是一个类,并不为这个类实际分配存储空间。