编译器是否能够自动检查每个源文件(及其相关的头文件,如果有的话)是否包含所需的所有其他头文件?或者至少发出警告,例如,如果未明确包含所需的标题?
例如,我希望编译器在我做这样的事情时报告:
那么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,所以我的问题主要适用于这些编译器。谢谢!
答案 0 :(得分:0)
据我所知,没有自动的方法。
我的建议是将内含物限制在标题中,仅限于.h中定义的“接口”所需的内容 在C ++编码标准(Sutter,Alexandrescu)中,你可以找到一个明确处理它的项目(标题为Make header files自给自足)。我引用:
负责任地行事:确保您编写的每个标题都是独立编译的 让它包含其内容所依赖的任何标题
和
但不要包含您不需要的标题;他们只是创建了流浪的依赖。 考虑这种技术来帮助强制标头自给自足:在构建中,编译 隔离的每个标头,并验证没有错误或警告。
此外,您应该首先包含您自己的.h,因为这样可以最大限度地发现是否存在包含错误。
在所有情况下,标题都应该是可交换的,这样如果你的文件包含a.h和b.h,那么两个可能的命令都应该这样做。