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