之前面试遇到的问题,没有答上来。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可以不加,默认属性)
当然还是要测试一下啦:

大功告成!