【发布时间】:2017-06-02 19:31:43
【问题描述】:
假设我有一个file.cpp,其中包含几个 C++ 头文件并使用标准库中的各种函数和类。可能是我使用了一些功能,这些功能来自我不直接包含的头文件,但被我包含的一些 other 标准库头文件间接包含。这是一个无意的编程错误,但由于间接包含,一切都将在我的平台上编译并正常工作。
不仅程序格式错误,而且无法保证其他平台也会有相同的间接包含,因此代码可能无法在其他平台上编译,这在实践中很常见。
是否有任何自动方法来检查这种类型的“缺少包含”,因为间接包含,我不能仅仅依靠我的平台上的编译失败?
作为一个具体的例子,在 gcc 的 libc++5 中,<memory> 标头包含一堆其他标准库标头,例如 <functional>,但在其他版本的编译器和其他编译器上并非如此。因此,如果我使用来自 <functional> 的内容,我不会收到编译器错误,但其他用户可能...
【问题讨论】:
-
更简单的方法是创建仅包含必需声明的虚假系统头文件,然后在工具链中使用它...如果包含错误,您将收到编译错误。最后,一旦所有包含都正确,链接器就会出错。
-
@Jarod42 这听起来很有趣。您能否在答案中详细说明这种技术?
-
“……这在实践中很常见。” - 我希望不是。至少在专业的项目团队中。 (这与“他们的工作有报酬”不同)。
-
忘记
#include标头是 编程错误。静态代码分析器工具可能会有所帮助,但我们不是推荐网站。 -
@Olaf:我认为丢失的正确包含比它应该发生的频率更高,但是在为新目标编译时很容易发现该错误并且很容易修复。在为不同的目标编译时,这种情况发生的频率较低。该功能将是对 include-what-you-use 等工具的良好补充
标签: c++ include header-files