C/C++包含头文件相关问题
看了两篇博客,第一篇http://blog.csdn.net/clever101/article/details/7269058,自己的工程现在还不是很大,应该不会遇到自定义函数和库函数重名的问题。
第二篇http://www.sf.org.cn/article/base/200808/21170.html,里面有句貌似是笔误了。最后一次示例处 class B;应为class A;
周四的时候被头文件包含搞得焦头烂额,自己用gcc -E 看了下预编译结果,基本明白了。
在诸如第二篇博客中提到这样一个问题。
1 #pragma once 2 3 #include “B.h” 4 5 class A 6 { 7 public: 8 B* b; 9 }; 10 11 //文件B.h中的代码 12 #pragma once 13 14 #include “A.h” 15 16 class B 17 { 18 public: 19 A* a; 20 };
源程序中
#include "a.h"
下略,会编译失败。
分析原因如下
#pragma once 这句,类似
#ifndef
#define
是为了防止重复include 而设置的语句, 一般在IDE内创建头文件会自动带有类似的语句。
避免了重复包含,但是却带来另一个问题。如上例,源文件中#include "a.h", 被展开如下
class B { public: A* a; }; class A { public: B* b; };
class B出现在最前是因为a.h的开始便 include 了 b.h,
在b.h中 include a.h 时因为a.h已经被define过了,没有展开,编译时便出错了
Description Resource Path Location Type
'A' does not name a type b.h /cross_include line 8 C/C++ Problem
第二篇文章给出了解决方法,不过似乎没有找到上述的原因。
两个头文件情况还比较简单,如果出现a include b, b include c, c include a,(环可以继续增大,可自行想象),并且确实互相调用了其他文件中定义的类或结构体。
编译时也会出错,且非常难查(环越大越难差),可见#pragma once 不是万能的。
最后,给出我的解决方法:
头文件尽量不要包含其他头文件,如果包含,请保证不要成环。保持清晰的树形结构。在源文件中包含所需头文件,有了# pragma once,基本不会出问题。
posted on 2013-03-17 13:28 zcranberry 阅读(251) 评论(0) 编辑 收藏 举报