我经常发现文件的头部分总是变得越来越大,但它从来没有变小过。在源文件的整个生命周期中,类可能会被移动和重构,并且很可能有相当多的#include不需要存在。保留它们只会延长编译时间,并增加不必要的编译依赖关系。试图找出哪些仍然需要是相当乏味的。
是否有某种工具可以检测多余的#include指令,并建议哪些我可以安全地删除? 棉绒会这样吗?
我经常发现文件的头部分总是变得越来越大,但它从来没有变小过。在源文件的整个生命周期中,类可能会被移动和重构,并且很可能有相当多的#include不需要存在。保留它们只会延长编译时间,并增加不必要的编译依赖关系。试图找出哪些仍然需要是相当乏味的。
是否有某种工具可以检测多余的#include指令,并建议哪些我可以安全地删除? 棉绒会这样吗?
当前回答
我认为PCLint可以做到这一点,但我已经有几年没有研究它了。你可以去看看。
我看了这个博客,作者谈到了一些关于配置PCLint以查找未使用的包含的内容。也许值得一看。
其他回答
CLion是JetBrains开发的C/ c++ IDE,可以即时检测冗余内容。这些在编辑器中是灰色的,但也有一些函数可以优化当前文件或整个项目中的包含。
我发现你需要为这个功能付费;当第一次加载时,CLion需要一段时间来扫描和分析您的项目。
很抱歉(再次)在这里发帖,人们通常不扩展评论。
检查我对crashmstr的评论,FlexeLint / PC-Lint会为你做这件事。信息信息766号。我的手册(8.0版)的11.8.1节讨论了这个问题。
另外,这一点很重要,不断迭代,直到消息消失。换句话说,在删除了不需要的头文件后,重新运行lint,一旦删除了一些不需要的头文件,更多的头文件可能已经成为“不需要的”。(这可能听起来很傻,慢慢读并分析它,这是有道理的。)
我认为PCLint可以做到这一点,但我已经有几年没有研究它了。你可以去看看。
我看了这个博客,作者谈到了一些关于配置PCLint以查找未使用的包含的内容。也许值得一看。
谷歌的cppclean(链接到:下载,文档)可以找到几种类型的c++问题,现在它可以找到多余的#includes。
还有一个基于clang的工具(包括您所使用的工具)可以做到这一点。include-what-you-use甚至可以建议前向声明(因此您不必#include那么多),并可选地为您清理#includes。
当前版本的Eclipse CDT也内置了这个功能:在Source菜单下单击Organize Includes将按字母顺序排列#include,添加Eclipse认为您正在使用的任何标题,但不直接包括它们,并注释掉它认为您不需要的任何标题。然而,这个特性并不是100%可靠。
结束这个讨论:c++预处理器是图灵完成的。包含是否是多余的,这是一个语义属性。因此,由Rice定理可知,包含是否多余是不可判定的。不可能有一个程序(总是正确地)检测包含是否多余。