7

设想:

富.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 中的其他方法也失去该包含的风险。

<vector>在 .cpp 和 .h 中重复包含是否正确?这种做法是否有意义,还是我应该只依赖标题中包含的内容?

4

4 回答 4

17

包括你需要的,仅此而已。

在多个 .h 文件和多个 .cpp 文件中包含相同的头文件本身不是问题。标头保护可有效缓解多次包含文件的问题。

如果您开始尝试避免多次包含同一个文件,它实际上可能是负面的,因为它通常会导致一个“大型包含文件”,其中包含您在整个项目中需要的所有内容这很糟糕,因为对任何头文件的一次更改都会导致所有内容都重新编译。

如果您担心 .h/.cpp 文件都包含同一个文件,请遵循以下准则:

  • 如果头文件中不需要包含,则只包含在CPP中
  • 如果头文件中需要类声明(但未使用),请在 .h 文件中使用前向声明并将其包含在 CPP 文件中。
  • 如果您实际在头文件中使用包含,请将其包含在头文件中而不是 CPP 中。
于 2012-07-24T21:52:45.047 回答
1

不,你不应该。它没有任何目的。冗余线路是成本没有收益。

每个文件都应该包含它需要的内容,仅此而已。在您的标头及其实现的特定情况下, .cpp 中的冗余声明无济于事。如果标头更改得足以使函数不再需要返回向量,则无论如何您都需要重新访问 .cpp。

于 2012-07-24T21:52:37.947 回答
1

在 .cpp 文件中,仅包含特定于实现的内容(实际上是 .cpp 文件)就足够了,而无需重复您已经包含在标题中的内容。这样,当有人查看您的代码时,他也可以更好、更清晰地理解您的代码。

了解哪些依赖项仅特定于实现可能非常有用,例如,当您将其升级/替换为另一个时(同时保留接口)。

于 2012-07-24T21:53:13.470 回答
1

在标头中包含尽可能少的文件,并且只将它们包含在需要它们的 .cpp 文件中。您的foo.h头文件可能包含在许多其他 .cpp 文件中,这些文件不需要来自其他头文件(在本例中为 vector.h)的声明,从长远来看,这会导致更长的编译时间和不太清晰的代码。

于 2012-07-24T21:55:39.037 回答