在编译时检查头文件的依赖项

时间:2013-07-10 11:05:12

标签: c++ visual-c++ gcc g++

编译器是否能够自动检查每个源文件(及其相关的头文件,如果有的话)是否包含所需的所有其他头文件?或者至少发出警告,例如,如果未明确包含所需的标题?

例如,我希望编译器在我做这样的事情时报告:

那么header1.h

#include <string>
...

header2.h

#include "header1.h"
#include <iostream>
std::string blah;    //<-- issue warning here, <string> not included explicitly
...

source2.cpp

#include "header2.h"
...
cout << endl;        //<-- issue warning here, <iostream> not included explicitly

我使用的是g ++和Visual Studio,所以我的问题主要适用于这些编译器。谢谢!

1 个答案:

答案 0 :(得分:0)

据我所知,没有自动的方法。

我的建议是将内含物限制在标题中,仅限于.h中定义的“接口”所需的内容 在C ++编码标准(Sutter,Alexandrescu)中,你可以找到一个明确处理它的项目(标题为Make header files自给自足)。我引用:

  

负责任地行事:确保您编写的每个标题都是独立编译的   让它包含其内容所依赖的任何标题

  

但不要包含您不需要的标题;他们只是创建了流浪的依赖。   考虑这种技术来帮助强制标头自给自足:在构建中,编译   隔离的每个标头,并验证没有错误或警告。

此外,您应该首先包含您自己的.h,因为这样可以最大限度地发现是否存在包含错误。

在所有情况下,标题都应该是可交换的,这样如果你的文件包含a.h和b.h,那么两个可能的命令都应该这样做。