sho*_*osh 272 c c++ refactoring dependencies include
我经常发现文件的标题部分一直变得越来越大但它永远不会变小.在源文件的整个生命周期中,类可能已经移动并被重构,很可能有很多#includes
不需要在那里再存在.将它们留在那里只会延长编译时间并增加不必要的编译依赖性.试图弄清楚哪些仍然需要可能是相当繁琐的.
是否有某种工具可以检测多余的#include指令并建议哪些可以安全删除?
lint可能这样做吗?
Jos*_*ley 162
谷歌的cppclean(链接到:下载,文档)可以找到几类C++问题,它现在可以找到多余的#includes.
还有一个基于Clang的工具,包括你可以使用的,可以做到这一点.包括你使用什么甚至可以建议前向声明(所以你没有#include这么多)并可选择为你清理你的#includes.
Eclipse CDT的当前版本也内置了此功能:在Source菜单下,单击Organize Includes将按字母顺序排列#include,添加Eclipse认为您正在使用的任何标头而不直接包含它们,并注释掉它所有的标题你认为你不需要.但是,此功能并非100%可靠.
Jar*_*Par 24
检测多余包含的问题在于它不能仅仅是类型依赖性检查器.一个多余包括为它提供了什么有价值的汇编文件,并不会改变它的其他文件依赖其他项目.头文件可以通过多种方式改变编译,例如通过定义常量,重新定义和/或删除已使用的宏,添加一个命名空间,该命名空间可以在某种程度上改变名称的查找.为了检测命名空间之类的项目,您需要的不仅仅是预处理器,实际上您几乎需要一个完整的编译器.
Lint更像是一种风格检查器,当然不具备这种全部功能.
我想你会发现检测多余包含的唯一方法是删除,编译和运行套件.
您可以编写一个快速脚本来擦除单个#include指令,编译项目,并在没有编译错误的情况下将名称记录在#include中,并将其从中删除.
让它在夜间运行,第二天你将有一个100%正确的包含文件列表,你可以删除.
有时蛮力只是起作用:-)
编辑:有时不会:-).以下是评论中的一些信息:
抱歉(重新)发布在这里,人们通常不会扩展评论.
检查我对crashmstr的评论,FlexeLint/PC-Lint会为你做这个.信息性消息766.我的手册(版本8.0)的第11.8.1节讨论了这一点.
此外,这很重要,继续迭代直到消息消失.换句话说,在删除未使用的标头后,重新运行lint,一旦删除一些不需要的标头,更多的头文件可能已经变得"不需要".(这可能听起来很傻,慢慢阅读并解析它,这很有道理.)