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

8 篇文章 0 订阅

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

原本只是简单的以为头文件互相包含只会触发,头文件的递归包含。即,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类的前面,

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

  • 6
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值