【问题标题】:Include files in .cpp standard在 .cpp 标准中包含文件
【发布时间】:2013-11-28 01:56:24
【问题描述】:

请在下面找到一个简单的示例。 我知道 .hpp 文件必须包含或转发声明它使用的所有内容 我想知道是否最好将 .cpp 文件中使用的所有 .hpp 文件也包含在内。 我之所以问这个问题是因为我最近在我正在从事的一个新项目中看到,人们倾向于在很多情况下避免包含标题。

在这种情况下:在 a.cpp 中包含 b.hpp 是否合适? 我知道它已经通过包含a.hpp被包含了,但是我个人觉得如果一个符号出现在一个.cpp中,它应该被包含(或者如果可能的话,向前声明)

a.hpp

#pragma once
#include "b.hpp"

class C; //forward declaration of C

class A
{
public:
    B get_b();
private:
    B  _b;
    C* _c;
};

a.cpp

#include "a.hpp"
//needed or I can leave it out, since B is included already in a.hpp?
#include "b.hpp"

B A::get_b()
{
    return _b;
}

【问题讨论】:

  • 如果您知道它已包含在内并且永远不会改变,请忽略它。如果您不确定,请将其包括在内。这里没有任何正确答案。
  • 这就是重点,在大型代码库中,任何人都可以确定什么会随着时间的推移而改变?我个人尽量做到最明确。在我最近分配的项目中不是这种情况,我想知道是否到处添加包含(并用前向声明替换无用的)
  • 就个人而言,在处理大型项目时,我有时更喜欢拥有一个包含我的源代码需要的任何内容的头文件,并且每个源代码都包含这个。如果您对单个标头进行大量更改,它可能会花费很长时间的构建时间,但是一旦标头(元标头,如果您愿意)稳定,它就会很方便。
  • @mah - 减少头文件包含可以将编译时间减少几个数量级。随着项目的增长,未定义的头文件的开销可能会呈指数级增长。包括“世界”不是最佳实践
  • @GlennTeitelbaum 这一切都取决于您的环境。正如我对您的回答所评论的那样,如果您支持预编译的标头,开销不仅不会增加,而且会减少。

标签: c++ build include


【解决方案1】:

尽量将#includes 移动到.cpp 文件中。它减少了编译时间并避免在整个项目中传播声明。因此,如果您可以在 .cpp 文件中包含 b.hpp。

在头文件中包含b.hpp 后,无需将其包含在.cpp 文件中。 由于标头保护(如果您放置了它们),在 .cpp 文件中再次包含它没有效果。

【讨论】:

    【解决方案2】:

    关于在 .cpp(和 .hpp)中包含哪些文件有两个主要问题

    1) 编译时间:减少包含数以减少编译时间

    大致:仅包含包含您使用的类数据/函数成员或内联函数/模板的文件。如果只引用一个类,前向声明的编译速度将比整个包含文件快得多。

    2) 脆弱性:不依赖于包含您需要的内容的包含文件

    如果 a.hpp 包含 b.hpp 并且您需要在 b.hpp 中定义的东西(见上文),然后 a.hpp 的实现者不再需要 a.hpp,您的代码就会中断

    所有这些都是确定性的,应该努力让它正确

    【讨论】:

    • 如果你有一个支持预编译头文件的构建环境,编译时间问题就会消失(实际上是改进而不是降级)。
    • @mah 它变成了一个规模问题——我不相信它会消失——它在较小的规模上是可以容忍的。有几篇关于这个的帖子:stackoverflow.com/questions/10577793/…
    • 格伦这些我都知道。头文件应该是不可知的,你应该能够单独包含它们。我更关注 .cpp 文件,我是否应该将它用于 .cpp 文件的所有内容也包括在内?
    • @GlennTeitelbaum 预编译头文件的全部目的是编译器提前解析了头文件(以及它的#includes)——这不仅仅是“较低的规模”,它只做一次工作,而不是每个源文件一次。
    • @dau_sama 这是在讨论将文件包含在 .cpp 中——仅当你必须时——进行小幅编辑以帮助澄清这一点
    猜你喜欢
    • 1970-01-01
    • 2017-08-18
    • 2018-09-15
    • 2012-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-17
    相关资源
    最近更新 更多