2011-05-04 77 views
21

我工作在一箇中等規模的C/C++項目上,我已經應用了Doxygen + Graphviz。它的標題圖很有用,但它們只顯示基於#include的關係。我感興趣的是找到一個(最好是基於Linux的)工具,它不僅基於#include分析文件依賴性,還基於實際的符號使用情況。例如,這樣的工具不僅會顯示a.cpp包括b.h,而且a.cpp使用SomeClass,它在b.h包含的c.h中聲明。它也能夠建議標題包括可能被修剪。「深」標題依賴性分析

回答

18

我以前用過Include What You Use,效果不錯。它使用Clang來解析C++代碼,並建議轉發聲明以添加並刪除頭文件。

一個缺點是它會對代碼的佈局做出假設 - 基本上就是Google的編碼標準。所以如果你有一個名爲SomeClass.cpp的文件,它只會看到SomeFile.h。此外,建議包括使用來自項目根目錄的完整路徑(因此#include "src/SomeClass.h"而不是#include "SomeClass.h")。最後,我改變了我的代碼到這個慣例,因爲它避免了含糊不清,但它需要一個頭,以防萬一你嘗試它。

通常你可以設置CC=include-what-you-use並重建得到結果 - 它使用所有的clang機制來解析-I包含參數。有一個Python程序使用結果來自動更新#include行。

編輯:

另一種工具,它並不像複雜,但比較簡單的設置和可以建議#include s到刪除是deheader。它通過將C++文件複製到臨時位置,刪除#include並重新編譯。如果重新編譯工作,那麼刪除該頭文件是安全的。它不會做的是提出前向聲明或任何幻想,但它可以減少實現文件中不必要的包含行。

+0

看起來很有前途,雖然它沒有安裝二進制文件是一個真正的痛苦。當我開始編譯llvm時,它充滿了我的硬盤容量。 – Reinderien 2011-05-04 21:38:12

+0

@Reinderien結賬和建立llvm + clang是「僅」在1Gb左右,記得要通過 - 啓用優化到配置腳本。調試版本將使您回到4Gb左右。 – richq 2011-05-05 07:07:46

+0

我終於能夠建立IWYU了 - 是的,它笨重,笨拙等等,但總比沒有好。我也會看看deheader。謝謝 – Reinderien 2011-05-06 00:05:19