头文件循环依赖(循环包括)
前序:
今天在编写网络库的时候,遇到了一个很奇怪的问题。实际场景是这样:一个类对应一个头文件,然后两个类互相依赖对方。语法没有任何错误,但就是找不到对应类的类型。后面发现是头文件循环依赖的问题。
编译报错:
在写比较大的项目中,可能就会出现头文件的循环依赖的问题。循环包括的现象表现为,语法无错误,但是编译期来就会出现:重复定义、未定义的标识符等。
如下图:
一般出现这种错误都要及时定位,查看对应的语法有无问题,若无问题,你就应该观察你项目中的头文件是否出现循环依赖的问题。
解决方案:
对于c++,在实际项目中,一个类一般对应一个头文件。这时候要避开头文件之间的循环依赖,就要用到c++中声明的语法。
例如:两个类A和B,A和B之间互相头文件循环依赖,你不应该在其对应的头文件中互相包含其头文件,如下:
A.h
#pragma once
#include <memeory>
#include"B.h"
class A{
public:
A();
private:
std::unique_ptr<B> b;
}
B.h
#pragma once
#include <memeory>
#include"A.h"
class B{
public:
B();
private:
std::unique_ptr<A> a;
}
这样就极有可能出现头文件循环依赖,导致编译出错,出现未定义,重定义的错误。
正确的做法如下,拿A来说:
#pragma once
#include <memeory>
//#include"B.h"
//声明B
class B;
class A{
public:
A();
private:
std::unique_ptr<B> b;
}
如上,声明类B,而不是包含其头文件,然后再A.c中包含B.h去实现功能就能循环包括的问题。