谈谈编译器错误 C3646与头文件相互引用问题
本文最后更新于305 天前,其中的信息可能已经过时,如有错误请发送邮件到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,所以不会出现头文件重复包含问题,问题也就解决了。

如果觉得本文对您有所帮助,可以支持下博主,一分也是缘
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇
/* */