本文最后更新于495 天前,其中的信息可能已经过时,如有错误请发送邮件到1739584917@qq.com
写项目时遇到的一个常见的问题,一般的情况可能是因为头文件的相互包含。
重现一下当时的经过:
当时有两个类A、B,分别在: a.h, a.cpp, b.h, b.cpp;
由于在B类中需要创建一个A类的对象,所以我在b.h中添加了a.h的头文件;但我在A类的子函数下使用B类的子函数,所以我又在a.h中添加了b.h的头文件,大致就像下面展示的这样:
//a.h文件
#pragma once
#include "b.h"
class A
{
void afunc();
}
//a.cpp文件
#include "a.h"
void afunc()
{
bfunc();
}
//b.h文件
#pragma once
#include "a.h"
class B
{
A aa;
void bfunc();
}
此时一编译,就会在“A aa”这一行出现了编译器错误 C3646,“error C3646: “aa”: 未知重写说明符”。
其实这上面就是出现了头文件互相包含的情况,也就是a.h包含了b.h, 而b.h也包含了a.h;我们知道,引入一个头文件时,是会将引入的头文件下的所有头文件全部展开的,此时b.h在a.h里面会展开a.h,a.h又包含了b.h,b.h又会继续展开……就形成了递归包含,进而导致编译出错。
事实上,我又得这么干,那应该怎么解决呢?像我上面的情况,你可以将a.h里的b.h写在a.cpp里面。
这样的话为什么又不会出现头文件相互包含的情况了呢?首先,a.cpp包含了a.h和b.h,而b.h又包含了a.h,但由于有#pragma once,所以不会出现头文件重复包含问题,问题也就解决了。