包括你使用的(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.hfile.cpp 也可能會使用 header2.h 的設施。這最初不會成為問題 - 程式碼會編譯,因為 header1.h 包含 header2.h。在另一個平臺,或當前平臺的升級,header1.h 可以修改,因此它不再包括 header2.h,並且 thenfile.cpp 將停止編譯結果。

IWYU 會發現問題並建議將 header2.h 直接包含在 file.cpp 中。這將確保它繼續編譯。類似的考慮也適用於 C 程式碼。