包括你使用的(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 代码。