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