cxx-clean-include是一個(gè)用于清理c++文件中多余#include并自動(dòng)生成前置聲明的工具,目前支持對(duì)visual studio單個(gè)c++項(xiàng)目作清理,以及清理整個(gè)文件夾下的c++文件,可以對(duì)visual studio項(xiàng)目(2005及以上版本)進(jìn)行清理,也可以對(duì)單個(gè)文件夾(含子文件夾)的c++源文件進(jìn)行清理。
使用方法
1. 下載本項(xiàng)目
2. 雙擊運(yùn)行hello文件夾下的run.bat
3. 如果成功的話,hello項(xiàng)目將被清理,且將在hello文件夾下生成清理日志(可使用瀏覽器查看)
4. 將run.bat里面的./hello.vcxproj改成你自己的vs工程文件,就可以清理你的工程了
注意:使用前請(qǐng)備份你的代碼
(如果無法正常使用,請(qǐng)?jiān)囍惭bvisual studio 2013的32位運(yùn)行時(shí)組件,可到官網(wǎng):https://www.microsoft.com/zh-cn/download/details.aspx?id=40784 中下載vcredist_x86.exe并安裝)
cxx-clean-include的一些測(cè)試結(jié)果
目前,已在網(wǎng)上的一些開源vs項(xiàng)目上測(cè)試使用了本工具(只是自行測(cè)試)
https://github.com/MSOpenTech/redis
該項(xiàng)目是由[MS Open Tech組織]將redis移植到windows下的版本,使用本工具清理msvs\RedisServer.vcxproj后發(fā)現(xiàn)共有28個(gè)文件(含.c文件和.h頭文件)包含多余的#include,清理后仍可編譯成功。 (清理前須將頭文件包含路徑中的$(SolutionDir)刪掉)
cxx-clean-include的作用
由于cxx-clean-include基于llvm+clang庫編寫而成,依托于clang庫對(duì)現(xiàn)有編譯器的兼容,所以本項(xiàng)目也支持大部分msvc、gcc/g++的語法,并完整支持c++11標(biāo)準(zhǔn)。
cxx-clean-include可以做到
清除c++文件中多余的#include(不僅可以清理cpp、cxx等后綴的源文件,也可以清理源文件包含的h、hxx、hh等后綴的頭文件)
自動(dòng)生成前置聲明(某些時(shí)候,會(huì)出現(xiàn)包含了某個(gè)文件,卻僅使用了該文件內(nèi)的類的指針或引用,而未訪問其成員的情況,此時(shí)cxx-clean-include將移除相應(yīng)的#include語句,并添加前置聲明)
自動(dòng)替換文件(某些時(shí)候,會(huì)出現(xiàn)#include了某個(gè)文件a,卻僅使用到該文件內(nèi)包含的其中一個(gè)文件b的情況,此時(shí)cxx-clean-include將遵循頭文件路徑搜索規(guī)則把原有的#include a語句替換成#include b語句)
針對(duì)整個(gè)項(xiàng)目進(jìn)行分析,而不僅分析單個(gè)c++源文件,通過采用合適的沖突處理規(guī)則,盡可能清理源文件和頭文件,并盡可能保證清理整個(gè)項(xiàng)目后,仍然沒有編譯錯(cuò)誤
關(guān)于cxx-clean-include的實(shí)際作用,舉個(gè)例子,假設(shè)有一個(gè)文件hello.cpp,里面的內(nèi)容是:
#include "a.h" // a.h文件的內(nèi)容是:class A{};
#include "b.h" // b.h文件的內(nèi)容是:#include <stdio.h>
#include "c.h" // c.h文件的內(nèi)容是:class C{};
#include "d.h" // d.h文件未被使用:class D{};
A *a; // 類A來自于a.h
void test_b() { printf(""); } // 函數(shù)printf來自于stdio.h
C c; // 類C來自于c.h
cxx-clean-include將對(duì)hello.cpp文件進(jìn)行分析:
~ 1. 首先,由于hello.cpp僅使用到a.h、b.h、c.h的內(nèi)容,因此,可移除#include "d.h"語句
~ 2. 其次,經(jīng)過分析,hello.cpp僅使用了a.h中類A的指針,因此,可新增前置聲明class A,并移除#include "a.h"語句
~ 3. 最后,hello.cpp雖然包含了b.h,卻僅使用到b.h所包含的stdio.h文件,因此,可將#include "b.h"語句替換為#include <stdio.h>
于是,在使用cxx-clean-include對(duì)hello.cpp進(jìn)行清理后,hello.cpp將變?yōu)?/p>
class A;
#include <stdio.h>
#include "c.h" // c.h文件的內(nèi)容是:class C{};
A *a; // 類A來自于a.h
void test_b() { printf(""); } // 函數(shù)printf來自于stdio.h
C c; // 類C來自于c.h
可以看出,hello.cpp第1行和第2行均被替換為更合適的語句。第4行則被移除
注意:本項(xiàng)目在windows和linux系統(tǒng)下均可進(jìn)行編譯,具體編譯過程可參考clang插件的編譯方法。
cxx-clean-include的命令
cxx-clean-include目前支持清理visual studio項(xiàng)目(vs2005及以上版本),同時(shí)支持清理指定文件夾下的c++文件,同時(shí)輸出結(jié)果是html格式,方便查看
1. 對(duì)于visual studio項(xiàng)目,可以使用以下命令:
cxxclean -vs vs項(xiàng)目名稱
// 比如:cxxclean -vs d:/vs2005/hello.vcproj
// vs項(xiàng)目名稱最好是絕對(duì)路徑,如: d:/vs2005/hello.vcproj、d:/vs2008/hello.vcxproj
該命令將清理整個(gè)vs項(xiàng)目內(nèi)的c++文件,同時(shí)將在當(dāng)前文件夾自動(dòng)生成清理日志
2. 對(duì)于單個(gè)文件夾,可以使用以下命令
cxxclean -clean 文件夾路徑
// 比如:cxxclean -clean d:/a/b/hello/
// 文件夾路徑最好是絕對(duì)路徑,如: d:/a/b/hello/、/home/proj/hello/
該命令將清理該文件夾內(nèi)的c++文件,同時(shí)將在當(dāng)前文件夾自動(dòng)生成清理日志
但很多情況下需要指定更詳細(xì)的編譯條件,如指定頭文件路徑、預(yù)定義宏等,clang庫已內(nèi)置提供了相應(yīng)的命令行參數(shù)供使用,可使用如下方式(注意添加--號(hào)):
cxxclean -clean 文件夾路徑 -- -I"你的頭文件搜索路徑" -D 需要預(yù)定義的宏 -include 需要強(qiáng)制包含的文件
(其中:-I、-D、-include均可使用多次)
// 例如:cxxclean -clean d:/a/b/hello/ -- -I"../../" -I"../" -I"./" -I"../include" -D DEBUG -D WIN32 -include platform.h
cxx-clean-include的命令行參數(shù)
在命令行中輸入cxxclean -help可獲取詳細(xì)的命令行參數(shù)信息
cxx-clean-include提供以下選項(xiàng):
-vs=<string> - 清理指定的visual studio項(xiàng)目(vs2005版本及以上): 例如:
cxxclean -vs ./hello.vcproj
該命令將清理hello項(xiàng)目中的所有c++文件
-vs可和-clean結(jié)合使用,例如:
cxxclean -vs hello.vcproj -clean hello.cpp
該命令將根據(jù)hello.vcproj項(xiàng)目的配置(如頭文件搜索路徑、預(yù)定義宏等配置)來清理hello.cpp文件
-clean=<string> - 清理指定的文件或文件夾, 例如:
1. cxxclean -clean ../hello/
該命令將清理hello文件夾(包括子文件夾)下的c++文件
2. cxxclean -clean hello.cpp
該命令將清理hello項(xiàng)目中的所有c++文件
-no - 即no overwrite的首字母縮寫, 當(dāng)傳入此參數(shù)時(shí),本工具僅執(zhí)行分析并打印分析結(jié)果,所有的c++文件將不會(huì)被改動(dòng)
-onlycpp - 僅允許清理源文件(cpp、cc、cxx后綴等), 禁止清理頭文件(h、hxx、hh后綴等)
-print-project - 打印本次清理的配置, 例如:打印待清理的c++文件列表、打印允許清理的文件夾或c++文件列表等等
-print-vs - 打印visual studio項(xiàng)目的配置文件內(nèi)容, 例如:打印頭文件搜索路徑、打印項(xiàng)目c++文件列表、打印預(yù)定義宏等等