请在下面找到一个简单的例子。 我知道.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;
}
答案 0 :(得分:3)
尝试将#include
移至.cpp
个文件,您可以使用多少。它减少了编译时间并避免了在整个项目中传播声明。因此,如果您可以在b.hpp
文件中添加.cpp
。
在头文件中包含b.hpp
后,您无需将其包含在.cpp
文件中。
将它再次包含在.cpp
文件中由于标题保护(如果你把它们放在一起)没有效果。
答案 1 :(得分:1)
关于要包含在.cpp(和.hpp)中的文件有两个主要问题
1)编译时间:减少包含数量以减少编译时间
粗略地说:只包含包含类数据/函数成员或您使用的内联函数/模板的文件。如果您只引用一个类,则前向声明的编译速度将比整个包含文件快得多。
2)脆弱性:不依赖于包含你需要的东西的包含文件
如果a.hpp包含b.hpp并且你需要在b.hpp中定义的东西(见上文)然后a.hpp的实现者停止需要a.hpp,你的代码就会中断
所有这些都是确定性的,应该努力使其正确