包括你使用的(IWYU)
Google 的包含你使用的專案(IWYU)可確保原始檔包含程式碼中使用的所有標頭。
假設原始檔 source.c
包含標頭檔案 arbitrary.h
,而標頭檔案 arbitrary.h
又巧合地包含 freeloader.h
,但原始檔也明確且獨立地使用 freeloader.h
中的設施。一切都很好開始。然後有一天 arbitrary.h
被改變,所以它的客戶不再需要 freeloader.h
的設施。突然,source.c
停止編譯 - 因為它不符合 IWYU 標準。因為 source.c
中的程式碼明確地使用了 freeloader.h
的設施,它應該包含它所使用的內容 - 源中也應該有一個明確的 #include "freeloader.h"
。 ( 冪等將確保沒有問題。)
IWYU 理念最大化了程式碼繼續編譯的可能性,即使對介面進行了合理的更改。顯然,如果你的程式碼呼叫隨後從已釋出的介面中刪除的函式,則無需任何準備工作就可以防止必要的更改。這就是為什麼儘可能避免對 API 進行更改的原因,以及為什麼有多個版本的棄用週期等。
這是 C++中的一個特殊問題,因為標準標頭檔案允許相互包含。原始檔 file.cpp
可能包含一個標頭檔案 header1.h
,在一個平臺上包含另一個標頭檔案 header2.h
。file.cpp
也可能會使用 header2.h
的設施。這最初不會成為問題 - 程式碼會編譯,因為 header1.h
包含 header2.h
。在另一個平臺,或當前平臺的升級,header1.h
可以修改,因此它不再包括 header2.h
,並且 thenfile.cpp
將停止編譯結果。
IWYU 會發現問題並建議將 header2.h
直接包含在 file.cpp
中。這將確保它繼續編譯。類似的考慮也適用於 C 程式碼。