如何防止源文件依赖于头文件中的包含


//Foo.h
#include <string>
struct Foo;
//main.cpp
#include "Foo.h"
int main(int argc, char *argv[])
{
  std::string s = "hello";
}

我对这段代码的问题是#include <string>泄漏到 main.cpp。 main.cpp 中需要#include <string>来编译,但如果在未来的版本中Foo.h不再需要字符串,main.cpp 将不会编译。

有没有办法防止这种情况?

编辑:我知道我可以通过始终包含我需要的每个文件来自己管理它,但我在一个团队中工作,每个人都做自己的事情,这完全是一团糟。所以我想知道是否有办法强迫这样做。

评论似乎表明我们必须手动管理它。我想这回答了我的问题。

不,没有自动方法可以保护自己免受无意中依赖通过其他标头包含的标头。

您需要做的是约束自己,在使用它们的每个源文件中包含相关标头,即使每个源文件中并不严格要求每个#include指令。

不过,忘记这些的后果并不可怕。如果 Foo.h 最终更改为不再包含字符串,则代码将无法编译,但修复很容易,几乎不需要时间。这不值得担心。

让每个文件只包含它真正需要的依赖项。此外,您应该使用包含保护(C++ #include保护)来保护自己的头文件。

#ifndef _INCLUDED_FOO_H_
#define _INCLUDED_FOO_H_ 
// Only #include <string> here if it is needed in the Foo.h
// ...
struct Foo;
// ...
#endif

主.cpp:

#include <string>
#include "Foo.h"
int main(int argc, char *argv[])
{
   std::string s = "hello";
}

这样 main.cpp 即使以后 Foo.h 更改,仍然可以编译。

最新更新