头文件互相包含所引发的的问题(深入剖析)

今天写程序出现了一个让人蛋疼的错误,后来发现是由于头文件互相包含所引起的。

原本只是简单的以为头文件互相包含只会触发,头文件的递归包含。即,A包含B,所以才A的头文件里会将B的头文件内容拷贝过来,然后B里又包含A,又将A

拷贝一份,这样就会无限循环。(下图为A.h和B.h互相包含,进行预编译时的结果·)

在这里插入图片描述

对于上述的问题,windows中有特有的#pragma once。但是更通用的做法是

#ifndef INCLUDE_文件名_H

#define INCLUDE_文件名_H

/中间内容/

#endif//!INCLUDE_文件名_H

以上都可以避免上述问题。

但是,今天的问题(如下图所示),很明显A需要B,但是找不到B的声明和实现。

在这里插入图片描述

这是为什么呢,我们进行预编译,然后在预编译文件中看一下

在这里插入图片描述

我们可以明显的看到,再进行去重复之后,A和B的类声明都只有一份,但是就是因为只有一份,所以必然有一个类会在另一个类之前进行了定义。

这个先后顺序,和你inlude包含的顺序有关系。因为,我们都知道预处理会把你include文件中的内容简单拷贝过来,所以,拷贝顺序和你include的顺序是有关系的。

言归正传,因为A在B之前定义了,所以对于B来说,可以找到A的声明和实现,但是对于A来说,它是找不到B的,但是,它的实现是依赖于B的,这就会导致图中的报错。

在这里,我们也可以推理到,如果A的实现和B无关,那么无论怎么相互包含,只要我们进行过了去重复的处理,都无所谓,不会出现问题。

既然,知道了问题的根源,那么处理问题的方法,也就可以简单的得到,既然A找不到B,我们又需要用B,那就自己手动的把B的声明加到A类的前面,

然后所有问题都解决了。。。。。。

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、付费专栏及课程。

余额充值