c++中不必要的包含

Unnecessary includes in c++

我的问题是关于 c++ 中的包含。想象一下这 3 个 .h 文件

// A.h
#include "B.h"
class A {
    B b;
}
// B.h
#include "C.h"
class B {
    C c;
}
// C.h
class C {

}

这里的问题是,A.h 需要访问 B.h,而不是 C.h。

A.h 在这种情况下可以通过 B.h 访问 C.h,因此这是一个不必要的包含。最近经常遇到这种情况,想知道如何避免这种情况。

首先;在许多情况下,您不需要类型的完整定义(当仅使用指针或对它的引用或将其用作 return 值时)。在这些情况下,您可以使用前向声明而不是包括完整的 header。 第二;如果您的 header 有适当的包含守卫,那么多次包含它们的成本非常低。

我知道没有 好的 工具可以找到不需要的包含(google "include what you use" 工具试过了,但根据我的经验,效果并不好).恐怕您只需要使用您对代码的了解来识别不需要的包含并手动删除它们。

The problem here is, that A.h needs access to B.h, but not C.h.

您的代码中没有不必要的包含。 A.h 不需要直接包含 C.hA.h 不能使用 B.h 而不(间接)也包含 C.h

我不认为这是可以做到的。在 c++ 中,预处理器包含 #include 指令,returns 实际编译器随后处理的文本文件。这是目前将代码添加到项目中的唯一方法。如果 B.h 需要 C.h,它必须以文本形式出现在 A.h 之前。

C++ 编译器无法"forgetting" 以前在一个翻译单元中定义所需的定义。

按照上面的建议使用 include 守卫。

#ifndef _A_H_
#define _A_H_
#include B.h
class A {
    B b;
}
#endif

您也可以使用指向 classes 的指针,然后显式构造和删除 classes。没有引用 class 成员和方法的内联代码的包含文件只需要知道它包含的东西是 classes 就可以有一个成员是指向 class 的指针。我认为这可能是一种封装形式,但我找不到一个很好的例子。

class B;
class A {
    B * b;
}