我经常发现文件的头部分总是变得越来越大,但它从来没有变小过。在源文件的整个生命周期中,类可能会被移动和重构,并且很可能有相当多的#include不需要存在。保留它们只会延长编译时间,并增加不必要的编译依赖关系。试图找出哪些仍然需要是相当乏味的。

是否有某种工具可以检测多余的#include指令,并建议哪些我可以安全地删除? 棉绒会这样吗?


当前回答

CScout重构浏览器可以检测C(不幸的是不是c++)代码中多余的include指令。你可以在这篇期刊文章中找到它如何工作的描述。

其他回答

这不是自动的,但是doxygen会为#included文件生成依赖关系图。你必须从视觉上看它们,但它们对于了解什么在使用什么是非常有用的。

结束这个讨论:c++预处理器是图灵完成的。包含是否是多余的,这是一个语义属性。因此,由Rice定理可知,包含是否多余是不可判定的。不可能有一个程序(总是正确地)检测包含是否多余。

很抱歉(再次)在这里发帖,人们通常不扩展评论。

检查我对crashmstr的评论,FlexeLint / PC-Lint会为你做这件事。信息信息766号。我的手册(8.0版)的11.8.1节讨论了这个问题。

另外,这一点很重要,不断迭代,直到消息消失。换句话说,在删除了不需要的头文件后,重新运行lint,一旦删除了一些不需要的头文件,更多的头文件可能已经成为“不需要的”。(这可能听起来很傻,慢慢读并分析它,这是有道理的。)

还可以查看include-what-you-use,它可以解决类似的问题。

Clangd现在正在为你做这件事。clang-tidy可能很快也能做到这一点。