【发布时间】: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 这一切都取决于您的环境。正如我对您的回答所评论的那样,如果您支持预编译的标头,开销不仅不会增加,而且会减少。