c++ 如果两个文件需要互相#include,不移动代码前提下如何解决?
2212
2022.10.31
发布于 未知归属地

之前面试遇到的问题,没有答上来。mark一下。

//A.h
#include B.h
void foo_a();
void base_a();
//A.cpp
#include A.h
void foo_a(){
    base_b();
}
void base_a(){}
//B.h
#include A.h
void foo_b();
void base_b();

//B.cpp
#include B.h
void foo_b(){
    base_a();
}
void base_b(){}

这样写绝对是编译不过的,由于文件互相包含。在不去移动函数的前提下,是否可以抢救一下呢?
答案是肯定的。

只需一行改动:去掉B.h的#include改为extern void base_a();(如果是c必需有extern)

//A.h
#include "B.h"
void base_a();

//A.cpp
#pragma
#include "A.h"
void foo_a()
{
    base_b();
}
void base_a()
{
    std::cout << "this is base_a" << std::endl;//test
}
//B.h
#include <iostream>
extern void base_a();//#include改为extern void base_a();
void foo_b();
void base_b();

//B.cpp
#include "B.h"
void foo_b()
{
    base_a();
}
void base_b()
{
    std::cout << "this is base_b" << std::endl;//test
}

为什么这样就可以了呢?在c++中,文件是分开编译的,A.h编译会正常通过的这毋庸置疑。B.h中,我们用到base_a()这个函数,先声明后使用,所以在前面声明一下extern base_a(); extern关键字告诉编译器,这个声明的函数实现不在这里,而是另一个文件,链接的时候就看到了。(c++ extern可以不加,默认属性)

当然还是要测试一下啦:
image.png

大功告成!

评论 (10)