1

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

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

一个.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;
}
4

2 回答 2

3

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

一旦包含b.hpp在头文件中,就不需要将其包含在.cpp文件中。.cpp由于标头保护(如果您放置它们),在文件中再次包含它没有任何效果。

于 2013-11-14T20:55:14.913 回答
1

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

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

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

2)脆弱性:不依赖于包含你需要的东西的包含文件

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

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

于 2013-11-14T21:06:03.767 回答