将文件包含在.cpp标准中

Include files in .cpp standard

本文关键字:标准 cpp 文件包      更新时间:2023-10-16

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

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

A.马普

#pragma once
#include "b.hpp"
class C; //forward declaration of C
class A
{
public:
    B get_b();
private:
    B  _b;
    C* _c;
};

答.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;
}

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

在头文件中包含b.hpp后,无需将其包含在.cpp文件中。由于标头保护(如果您放置它们),因此再次将其包含在.cpp文件中不起作用。

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

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

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

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

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

所有这些都是确定性的,应该努力把它做好。