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

时间:2013-02-23 16:32:26

标签: c++ circular-dependency

编辑:带有警卫的修改头文件。我忘记把这些放在这个例子中。虽然我的项目已经有了这些。

我有这两个分支。

文件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.cpp:

#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提供了一个B类的对象,它通过getB()使用它自己,因为每个A必须只有一个B的实例。 ,我虽然这没关系。通过编译时间增加了几秒钟,因为我这样做了,而且我的项目中只有一个类很少。

循环依赖关系需要很长时间才能编译吗?如果是这样,编译具有大量循环依赖关系的项目可能需要花费很多时间。

1 个答案:

答案 0 :(得分:1)

编译大项目,特别是优化可能需要很长时间。但在您的情况下,罪魁祸首是您不在标头中使用保护,并且编译器必须多次解析相同的头文件。所以解决方案可能是(对于文件a.h):

#ifndef A_H_
#define A_H_
// 
//

#endif // A_H_

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