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编辑  收藏  举报

导航