【问题标题】:Redundant #include in C/C++?C/C++ 中的冗余#include?
【发布时间】:2011-10-20 02:51:47
【问题描述】:

假设现在我有三个源文件:ClassA.hpp、ClassB.hpp 和 ClassC.hpp。

ClassB 继承自 ClassA,ClassC 继承自 ClassB。

所以,在 ClassB.hpp 中,我写了 #include "ClassA.hpp"。 那么,在ClassC.hpp中,除了包含ClassB.hpp,是不是还要包含ClassA.hpp?

在编写 Makefiles 时,我应该让 ClassA.o 成为 ClassC.o 的依赖项吗? 而在cmake中——如果我不在ClassC.hpp中写#include“ClassA.hpp”,ClassA.o就不会是ClassC.o的依赖,对吧?可以吗?

【问题讨论】:

    标签: c++ c makefile cmake qmake


    【解决方案1】:

    ClassC.hpp是否需要ClassA.hpp的内容,暂时不考虑ClassB.hpp?

    如果是这样,那么是的,您应该包含它,而不是依赖可能会改变的迂回意外包含。检查并设置正确的包含应该相对简单。依赖另一个文件或稍后可能会改变的行为是不好的做法,不应使用。

    编辑:在继承的情况下,问题适用,事情有点不同。在这种情况下,您可以依赖需要 A 的 B,并且可以说您不直接依赖 A(如果 B 更改为从 Q 继承,C 将不再需要 A)。您想查看标头或类依赖于什么,并包含提供它的文件。如果它直接依赖于某些东西,则直接包含它。

    使用标头保护可以使多次包含标头变得无害,并且在较大的代码库中非常常见。

    【讨论】:

    • 目前在 Class[ABC].hpp 中只有 Class[ABC] 的定义。所以在这种情况下,我根本不需要在 ClassC.hpp 中包含 ClassA.hpp,即使 ClassC 是从 ClassA 派生的,对吧?
    • 在不包含 ClassA 或 ClassB 的情况下,ClassC.hpp 会正确编译吗?这就是你想要的测试。如果 ClassC 派生自 ClassA,则代码无法通过测试,您确实需要包含它们。如果 C 和 B 都继承 A,则只包含各自的 A;如果 C 继承了 B,而 B 继承了 A,则包含 B(这可能是您应该依赖 B 包括 A 的唯一情况),
    【解决方案2】:

    关于品牌,ClassC.o 不应依赖于 ClassA.o。它应该对 ClassA.hpp 有依赖关系,即使它是通过 ClassB.hpp 间接包含的,通常也会生成它。

    如果 ClassB.hpp 依赖于 ClassA.hpp 中定义的内容,我希望 ClassB.hpp 明确包含 ClassA.hpp。我认为这样更干净。

    【讨论】:

    • ClassA 是 ClassB 的基类。那么为什么不包括它呢?有些人会写“class A”吗?在 ClassB.hpp 然后开始写 ClassB 而不包括 ClassA.hpp?
    • 那么当ClassA.hpp发生变化时,ClassC.o不需要重新编译?
    • 是的,当 ClassA.hpp 发生变化时,需要重新编译 ClassC (.cpp)。我假设您的 .hpp 文件是头文件,并且它们的更改频率通常低于关联的 .cpp 文件。如果 ClassA.cpp 更改,但 .hpp 没有更改,则 ClassC 不需要重新编译。这符合你的情况吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-22
    • 2014-09-04
    • 2017-09-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多