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

时间:2014-11-19 20:44:43

标签: c++

//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将无法编译。

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

编辑: 我知道我可以自己管理这个,总是包括我需要的每个文件,但我在团队中工作,每个人都做自己的事情,这是一个完整的混乱。所以我想知道是否有办法强迫这一点。

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

2 个答案:

答案 0 :(得分:4)

不,没有自动方法来保护自己免于无意中依赖于您通过其他标题包含的标头。

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

但是,遗忘的后果并不严重。如果 Foo.h 最终更改为不再包含 string ,则代码将无法编译,但修复很容易,几乎没有时间。这不值得担心。

答案 1 :(得分:2)

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

foo.h中:

#ifndef _INCLUDED_FOO_H_
#define _INCLUDED_FOO_H_ 

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

#endif

main.cpp中:

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

这样,即使Foo.h稍后更改,main.cpp仍会编译。