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

时间:2012-07-24 21:46:21

标签: c++ include software-design

情景:

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>是否正确?这种做法是否有意义,还是应该依靠标题中包含的内容?

4 个答案:

答案 0 :(得分:15)

包括您需要的内容,仅此而已。

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

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

如果您担心同时包含相同文件的.h / .cpp文件,请遵循以下准则:

  • 如果头文件中不需要包含,则仅将其包含在CPP中
  • 如果头文件中需要类声明(但未使用),请在.h文件中使用forward声明并将其包含在CPP文件中。
  • 如果您实际在头文件中使用include ,请将其包含在头文件中,而不是CPP中。

答案 1 :(得分:1)

不,你不应该。它没有任何意义。冗余线路成本没有任何好处。

每个文件都应该包含它所需要的内容而不是更多内容。在您的标题及其实现的特定情况下,.cpp中的冗余声明没有帮助。如果标题改变得足以使函数不再需要返回向量,则无论如何都需要重新访问.cpp。

答案 2 :(得分:1)

在.cpp文件中,只包含特定于实现的内容(实际上是.cpp文件),而不重复已包含在标头中的内容。这样,当有人查看您的代码时,他也可以更好,更清晰地理解您的代码。

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

答案 3 :(得分:1)

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