我应该在.cpp和.h中重复包含吗

Should I repeat inclusions in .cpp and .h?

本文关键字:包含吗 cpp 我应该      更新时间:2023-10-16

场景:

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。