是否有去除c++多餘頭文件的工具?
如題,我利用clang的庫寫了這麼一個工具,打算髮布出來
發之前想先問問看是不是已經有這種工具了,我之前一直沒找到才寫的,不過還是確認看看如果已經有做得很好的工具我就不發了,自己用用就好沒有的話我就發到github,注釋寫詳細點作為clang語法樹入門小範例比如:假設一個文件hello.cpp,裡面的內容是: #include "a.h" #include "b.h" #include "c.h" #include "d.h" #include "useful.h" ... ... 而其中只有useful.h被用到,那麼a.h、b.h、c.h、d.h的#include語句將被移除掉,最終hello.cpp變為: #include "useful.h" ... ...
有一個 include-what-you-use:
http://include-what-you-use.org/https://github.com/include-what-you-use/include-what-you-use這個是 Google 的內部工具開源出來的,也是基於 llvm/clang 實現的,跟題主的實現思路估計比較像。Resharper有代碼分析clean up code的功能,但要Visual Studio
從@曉楚那裡看到的:
有款工具:
http://catb.org/~esr/deheader/Find and optionally remove unneeded includes in C or C++ sourcefiles.
deheader analyzes C and C++ files to determine which header inclusions can be removed while still allowing them to compile. This may result in substantial improvements in compilation time, especially on large C++ projects; it also sometimes exposes dependencies and cohesions of which developers were unaware.
2016-03-10工具已經上傳到 GitHub - cxxclean/cxx-clean-include目前支持對visual studio單個c++項目作清理,以及清理整個文件夾下的c++文件
cxx-clean-include的簡要原理如下(此外還有很多細節未一一說明,但下面已經涵蓋了對單個文件的基本分析流程):
1.
清除多餘的#include(這一步最簡單)
以下圖為例
上圖表示,雖然[主文件.cpp]包含了很多文件,但只用到了B2.h、D2.h、E1.h頭文件
處理辦法:保留有用文件的所有祖先文件
處理的結果如下圖
可以看出,B2.h、D2.h、E1.h的所有祖先文件均被保留下來
2.
採用前置聲明替換#include
以下圖為例
上圖表示,文件B2中的類或結構體僅被C1用來聲明指針或引用,除此之外B2文件中的內容根本不被其他文件關心。
處理辦法:找到包含B2的那條#include語句,直接把那條語句替換成前置聲明。
比如,假設B2.h中僅定義了class B2_Class{ int n; },則把B1文件中的#include 「B2.h」語句替換成class
B2_Class;前置聲明語句
3. 深層#include取代淺層#include
以下圖為例
上圖表示,雖然[主文件.cpp]包含了很多文件,但只用到了B2.h、D2.h、E2.h、F2.h頭文件
處理辦法:對於每個頭文件,若其可被後代取代,則進行替換
處理之後的結果如下圖
如上圖,可以看到:
#include 「B.h」被替換成了#include
「B2.h」
#include 「C.h」被替換成了#include
「D1.h」
感謝軟體作者給了這麼好的一個工具,文檔也寫得好。我下載了一個視頻Codec的開源項目,由於我只需要解碼(decode)部分,那些龐大繁複的「編碼(encode)」過程可以不要,所以用這個工具試了一下,可以看出軟體是強大的,可惜卡在系統頭文件( windows.h 之類)上了,雖然可以用 -include 參數來補充,但是不妨這樣想,一來 這類系統頭文件本身就不允許改寫的,你去掃描分析並沒有現實意義。二來系統自帶的頭文件 總是調用系統SDK的,這類SDK文件同樣也是 分析出來也不能改寫,所以完全可以略過不管,應該把軟體設定為「僅掃描項目dir下的文件」,這樣既簡單又安全。
其實想優化SDK頭文件是很簡單的,我們只需手工加上 // 注釋掉 include &
另外,這個軟體不能識別 def 文件,對於 DLL 項目是一個缺陷。譬如在 def 文件中我 只需 輸出 2個 DLL函數,這樣 dll.cpp 裡面其它「無關」的函數是可以優化的。當然折衷辦法還是有的,可以另外寫一個 fake.cpp,裡面僅包含這兩個函數,然後單獨優化這個 fake.cpp 即可。
所以我建議作者優先解決「略過 系統SDK文件」的問題,讓這個軟體在「自然狀態」下能夠跑起來,而不是頻繁中斷在 windows.h 等一堆 SDK 之下,拋出一個接一個error,用戶被迫不斷修改命令行(變得「水蛇春咁長」),意興闌珊。
Coverity有一條規則檢測這種頭文件重複或者循環引用。
github不是說方便你「發布」一個軟體,而是放你願意分享的源碼,有人一起做就更好了的平台。所以放上去就是了
開源輪子不嫌多。為什麼不發布那?
我程序 用到Qt的, 和包含預編譯頭文件stdafx.h 會有很多問題。
比如老說 stdafx.h可以去掉 qt也有很多問題
我用了Resharper很強大, 可以一下去掉一個工程的無用include, 點一個無用的include時有選項的,一下去掉一個解決方案的
試多了下, 還是不行, 往往將有用的頭文件也會去掉, 不聰明
我去......所以C++還是得微服務架構~better than docker。。。【捂
有沒有這個功能,將可以前置聲明的非必要頭文件也去掉,然後添加前置聲明?
個人試過,CLion可行,雖然有時候會有些奇怪的現象出現
難道沒有一款ide幫你做這個?jetbrains家的好像可以,但是沒試過他們的c ide
推薦閱讀:
※用 Visual Studio 2013 能學好 C++ 嗎?
※使用Visual studio 2015 找不見C++?
※C++類型問題,typeid與sizeof運算符的差異?
※C++11(VC++) 中支持多種for循環寫法,哪種比較好?