c++头文件互相包含的问题解析

假设存在a如下文件:

a.cpp a.h b.cpp b.h

上述4个文件分别定义了两个类:类A和类B,假设这两个类需要互相调用,即在a.h中

.....
#include "b.h"   //包含B的头文件
class A{
....
}
......

在b.h中同样要包含a.h

.....
#include "a.h"   //包含A的头文件
class B{
....
}
......

这样就形成了互相包含。但是这种情况下我们去编译的时候往往会报错

'A' has not been declared

还有

'B' has not been declared

 产生这样的原因是什么呢?猛的一看可能觉的互相包含,感觉上形成了递归,越想越复杂,其实不然,在编译阶段存在一个预处理的步骤,预处理的工作就是将头文件中内容复制到包含他的cpp文件中,为了避免产生递归,即每隔头文件在一个cpp文件中仅存在一份拷贝,每个头文件的开头都会看到如下的描述:

#ifndef xxxxx_H
#define xxxxx_H
...
...
...
#endif

这样的描述就形成了一个代码块,含义与条件编译一样,如果该文件中已经存在了该符号,说明在该cpp文件中已经包含了该头文件,不需要再次包含该头文件,直接退出即可,无需再次读取该头文件的内容,这样就形成不了递归了。

那错误是怎样生成的呢?我们仔细分析一下,假设经过上述的预处理步骤后,a.cpp中应该是这样的:

class B{
.....
A* a;
}

class A{
.....
B* b;
}

看看预处理完成后的a.cpp,仔细看看有没有问题,很明显在a.cpp中class A没有问题,但是class B就存在问题了,问题是类B中存在一个成员变量A* a,但是在B之前没有对A的任何声明,所以在编译的时候会提示A没有声明,同样编译b.cpp时也会报类似的错误,大家可以自己推导一下。

总结:

在头文件互相包含时,一定要在每个头文件中要做对互相包含的头文件涉及的类做类的前置声明,

#include "b.h"
class B;   //前置声明
class A{

...
B* b;
}

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言中的头文件互相包含问题,是指多个头文件之间相互引用、相互包含而导致的编译错误。当两个头文件相互引用时,会造成无限循环的包含,使得编译器无法正常解析和处理。 这个问题通常由于程序的模块化设计不合理所导致。在C语言中,头文件的作用是引入函数、变量的声明和定义,以供其他源文件使用。如果两个或多个头文件之间相互引用,意味着它们之间存在依赖关系,即一个头文件中引用了另一个头文件中的函数或变量。 当头文件A引用了头文件B,而头文件B又引用了头文件A时,编译器会陷入无限循环,因为当编译器处理头文件A时,会读取并解析头文件B,而在处理头文件B时,又会读取并解析头文件A,如此循环下去,直到编译器出现错误。 为了解决头文件互相包含问题,可以采取以下方法: 1. 使用预编译指令#ifndef、#define和#endif来避免重复包含。在头文件的开头和结尾使用这些指令,可以防止头文件被重复引用。 2. 使用前向声明来替代包含头文件。如果只需要引用函数或变量的声明而不需要其具体定义,可以使用前向声明来替代包含头文件的方式,以减少头文件之间的相互依赖。 3. 重新设计程序结构,减少头文件之间的相互引用。通过合理的程序设计,可以降低模块之间的耦合性,减少或避免头文件互相包含问题。 综上所述,头文件互相包含问题是C语言中常见的编译错误,通过采取预编译指令、前向声明和重新设计程序结构等方法,可以有效地解决这个问题

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值