循环依赖关系通常需要花费大量时间来编译吗

Do circular dependencies generally take a lot of time to compile?

本文关键字:时间 编译 关系 依赖 常需 循环      更新时间:2023-10-16

编辑:使用保护修改了头文件。我忘了把这些放在这个例子里。尽管我的项目中已经有了这些

我有这两节课。

文件a.h:

#ifdef A_H
#define A_H
#include "b.h"
#include "x.h" //not related to problem, is just included
class B; //fwd declaration, needed to use getB() outside of A
class A
{
public:
    A(X &x);
    B &getB();
    ...
private:
    X &x;
}
#endif

文件b.h:

#ifdef B_H
#define B_H
#include "x.h"
class A; //fwd declaration
class B
{
public:
    B(X &x, A &a);
    void methodThatUsesA();
    ...
private:
    X &x;
    A &a;
}
#endif

文件a.cp:

#include "a.h"
#include "b.h"
A::A(X &x):x(x){}
B& A::getB()
{
    static B b(x, *this);
    return b;
}
...

文件b.cpp:

#include "b.h"
#include "a.h"
B::B(X &x, A &a) : x(x), a(a){}
void B::methodThatRequiresA(){
    //does its thing...
}

从它们的外部,我这样使用它们:

#include "x.h"
#include "a.h"
X x(...);
A a(x);
a.getB().methodThatRequiresA();

继续说,我有一个类B,它需要一个类a的对象才能工作,而a通过getB((提供了一个使用自己的B类型的对象,因为每个a必须只有一个B的实例,我认为这没关系。尽管编译时间增加了几秒钟,但我的项目中只多了一个类,这很少。

循环依赖项的编译需要这么长时间吗?如果是这样的话,编译这样有很多循环依赖关系的项目可能会非常耗时。

编译大型项目,尤其是优化项目可能需要很长时间。但在这种情况下,罪魁祸首是在头中没有使用保护,编译器必须多次解析同一个头文件。所以解决方案可以是(对于文件a.h(:

#ifndef A_H_
#define A_H_
// 
//
#endif // A_H_

有不同的解决方案,比如MSVS等中的pragma,但这是IMO最便携的方式。符号不必完全像这样,但必须是唯一的。