我应该在.cpp和.h中重复包含吗
Should I repeat inclusions in .cpp and .h?
场景:
foo.h:
#include <vector>
class foo {
public:
std::vector<int>* getVector();
/* ... other methods declarations ... */
}
foo.cpp:
#include "foo.h"
#include <vector>
/* ... other methods definitions using std::vector ... */
std::vector<int>* foo::getVector() {
return new std::vector<int>();
}
我希望.cpp独立于标头中将来可能发生的任何更改。如果由于任何原因,类的接口发生了更改,并且可以消除来自<vector>
的依赖关系,那么.cpp中的其他方法也可能会失去这种包含。
在.cpp和.h中重复包含<vector>
是否正确?这种做法有意义吗?还是我应该仅仅依靠页眉中的内容?
包括您需要的东西,仅此而已。
在多个.h文件和多个.cpp文件中包含相同的头文件本身并不是问题。标头保护可以有效地减少多次包含文件带来的问题。
如果你开始尝试避免多次包含同一个文件,它实际上可能是负面的,因为它通常会导致一个"超级包含文件",其中包含整个项目中所需的所有。这很糟糕,因为对任何头文件的一次更改都会导致所有内容重新编译。
如果您担心.h/.cpp文件都包含同一个文件,请遵循以下准则:
- 如果头文件中不需要include,则只将其包含在CPP中
- 如果头文件中需要类声明(但未使用),请在.h文件中使用正向声明,并将其包含在CPP文件中
- 如果您实际在头文件中使用include,请将其包括在头文件而不是CPP中
在.cpp文件中,只包含特定于实现的内容(.cpp文件实际上是什么)就足够了,而不重复已经包含在头中的内容。这样,当有人查看您的代码时,他也可以更好、更清晰地了解您的代码。
了解哪些依赖项仅针对实现是非常有用的,例如,当您用另一个依赖项升级/替换它时(同时保留接口)。
在标头中包含尽可能少的文件,并且只将它们包含在需要它们的.cpp文件中。foo.h
头文件可能包含在许多其他.cpp文件中,这些文件不需要来自其他头文件(在本例中为vector.h)的声明,从长远来看,这会导致更长的编译时间和更少的清晰代码。
不,你不应该。它没有任何作用。冗余线路成本低,效益低。
每个文件都应该包括它所需要的内容,而不是更多。在头及其实现的特定情况下,.cpp中的冗余声明没有帮助。如果标头的更改程度足以使函数不再需要返回向量,那么无论如何都需要重新访问.cpp。
- 有充分的理由在h文件中使用include保护而不是cpp文件吗
- 无法在UE4中包含BP类到CPP类
- 模板专业化可以进入我的.cpp吗?
- 我应该将除 .cpp 以外的其他文件添加到 git 中吗?
- 我可以创建一个包含两个变量的 for 循环,但时间复杂度仍然为 O(n) 吗?
- 范围 v3 可以包含初始值设定项列表的工作吗?
- 包含在.cpp文件中包含在 .h 文件时包含
- 只有包含在标头中而不包含在cpp文件中时,标头才会抛出错误
- 将 Boost 标头包含在 .h 文件中但不包含在.cpp文件中时出错
- 在包含新CPP文件后的链接过程中,MSVC 错误
- C++模板可以用于条件代码包含吗
- 在包含 R/Cpp 代码的 R 包中使用 roxygen2 for R 函数
- 我应该在.cpp和.h中重复包含吗
- 将文件包含在.cpp标准中
- 如何将文件作为字符串和代码包含在cpp中
- 为什么我不需要在标题中包含库.cpp?
- 在Main.cpp中包含头文件有限制吗?
- 为什么.h文件包含在.cpp文件中,而不是相反
- 为什么我不能将静态库包含在 cpp 文件中?
- 已包含在cpp文件中