是否有去除c++多余头文件的工具

作者:洪坤安
链接:https://www.zhihu.com/question/39796313/answer/90159932
来源:知乎
著作权归作者所有,转载请联系作者获得授权。

2016-03-10

工具已经上传到 GitHub - cxxclean/cxx-clean-include

目前支持对visual studio单个c++项目作清理,以及清理整个文件夹下的c++文件

举个例子,比如现在有visual studio 2005项目hello.vcproj,那么使用命令:

cxxclean -clean hello.vcproj --

将会清理项目内的cpp文件以及cpp文件所#include到的头文件

再比如有一个文件夹hello,那么使用

cxxclean -clean ./hello/ --

将清理hello文件夹下的cpp文件以及cpp文件所#include到的头文件

github页面上我上传了hello.sln工程,在尝试使用本工具清理自己的项目之前,可以先在hello.vcxproj项目作测试

另外,清理c++项目前请务必使用版本工具备份!

其余的看github说明

--------------

2016-04-20

我是提问者,上面是我之前在3月10号的回答,由于当时工具初步完成(没错,我提问的时候其实工具压根还没写好),自己本身也较忙,所以回答并不详细,现在一个多月过去了,工具已经完善,文档、代码注释、说明文件也都已经补齐。我觉得应该再补充说明一下,同时,各答主们推荐的工具作说明我也试用了一些,试用情况我也会稍作说明,以方便有需要的人选择合适的工具。

这里要说的一点是,如果你的项目编译比较久,在使用各答主们推荐的工具之前,最好先试一下预编译、联合编译、ccache之类的缓存工具这3种方法,因为这3种方法对编译速度的提升是非常巨大的,仅当你在采用后仍然对编译时间不满意,且没有充足的时间和精力和金钱来解决,才有必要考虑清理c++文件内多余的#include。

首先是 @chys 答主提到的include-what-you-use工具,该工具目前可以在windows和Ubuntu下直接使用,其他平台上则需要再下载llvm+clang进行编译(编译时间会很长,应该在1个小时左右),根据我的试用和猜测,include-what-you应该是本问题的各回答中处理单个cpp文件时功能最强大的一个工具,支持删除无用的#include,支持自动用前置声明替换掉#include语句,支持在#include语句后添加注释,但个人认为上手较为困难,需要安装python环境,而且在windows下较难自动化处理,参数使用困难,而且很遗憾的是,include-what-you-use似乎每次都只单独对一个cpp进行分析,这也意味着它只能采用最保守的只清理cpp不清理h文件的方式来保证清理完后不会产生一堆编译错误。推荐在linux系统下采用该工具。

还有匿名答主提到vs插件Resharper For C++,这个插件很易用而且提示效果友好,当你用vs开发某个cpp文件时,用这个插件可以点一下就清理掉cpp文件内多余的#include,而且如果某行#include无效,#include整行会自动变灰暗,看上去非常直观,因此推荐用vs的朋友使用该插件来清理单个的cpp文件。缺点也很明显,如果想要清理大批量的cpp文件会点到手酸,并且只清理当前文件,无法清理当前文件包含的其他文件内的#include,也不支持include-what-you-use可以做到的自动替换前置声明。推测其是根据单词匹配来清理的。

还有 @陈晓辉 提到的deheader工具,采用python开发,因此也需要python环境,看了下源码,原理应该也是基本的单词匹配。所能达到的效果估计和Resharper For C++较为类似。

此外还有 @jiangcy 提到的clion这款ide以及 @韩葆-逸松 提到的Coverity,由于没有合适的环境试用所以不清楚实际效果,希望有了解的知友能告知一下。

最后就是我开发的工具了,现在的名字叫cxx-clean-include,目前仅提供win32可执行文件(linux下也能编译),是基于llvm+clang开发的,可以做到清除无用#include、用前置声明替换#include、尽量用深层#include替换浅层#include,同时该工具额外的一个效果是:如果只给1个cpp,可以把cpp包含的其他头文件一起清理(位于项目文件夹下的头文件才会被清理),如果给多个cpp,则会先把这些cpp文件的分析结果汇总起来再逐一清理。比如,假设2个cpp文件都包含头文件a,分析第1个cpp文件时认为头文件a的第1行#include没用,分析第2个cpp文件时却认为头文件a的第1行#include有用,最终结果就是,头文件a的第一行#include不应被删除。

具体本工具达到的效果在上面3月10号的回答里已经讲了,下面要讲讲是本工具的原理,这样大家在使用的时候可以有个整体的概念,也希望对有兴趣的人有所帮助。


cxx-clean-include的简要原理如下(此外还有很多细节未一一说明,但下面已经涵盖了对单个文件的基本分析流程):

1. 清除多余的#include(这一步最简单)

以下图为例

<img src="https://i-blog.csdnimg.cn/blog_migrate/0daa67deaf4c6c8a209bbd8980393dc1.jpeg" data-rawwidth="820" data-rawheight="529" class="origin_image zh-lightbox-thumb" width="820" data-original="https://pic2.zhimg.com/2c424aa443a9eeadb8f1c9b2b8177a49_r.jpg">

上图表示,虽然[主文件.cpp]包含了很多文件,但只用到了B2.h、D2.h、E1.h头文件

处理办法:保留有用文件的所有祖先文件

处理的结果如下图


https://www.zhihu.com/question/39796313?sort=created

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值