用途:指导代理使用 IWYU 精简 C/C++ 的 #include,减少编译级联,解读 IWYU 报告与映射文件,判断使用前置声明还是完整包含,并将 IWYU 集成进 CMake 构建。
安装与运行:Ubuntu/Debian 用 apt-get install iwyu,macOS 用 brew install include-what-you-use。单文件运行 iwyu -Xiwyu --error main.cpp 2>&1;通过 compile_commands.json 用 iwyu_tool.py -p build/ src/main.cpp 2>&1 | tee iwyu.log;整项目运行 iwyu_tool.py -p build/ 2>&1 | tee iwyu.log。
CMake 集成:用 find_program(IWYU_PROGRAM NAMES include-what-you-use iwyu),设置 CMAKE_CXX_INCLUDE_WHAT_YOU_USE 并在构建时用 clang++ 进行分析,日志可 tee 到 iwyu.log。
解读输出:should add 表示使用了但未包含的符号头文件;should remove 表示包含但未直接使用其符号的头文件;full include-list 为最终头文件列表。
自动修复:用随附的 fix_include 脚本处理日志,可用 --nosafe_headers、--comments、--dry_run、--only_re 等选项,也可 iwyu_tool.py -p build/ 2>&1 | fix_include 一次性应用。
前置声明与完整包含:当仅需指针或引用参数、返回指针、基类在别处定义时可用 class Widget; 前置声明;继承、访问成员、创建实例、sizeof、模板实例化时需完整包含。建议在头文件前置声明,只在 .cpp 中包含完整定义。
映射文件:iwyu.imp 可把私有头映射到公开头(如 <bits/types.h> 到 <sys/types.h>),也可做符号到头文件映射;IWYU 自带 gcc.stl.headers.imp、libcxx.imp、boost-1.62.imp 等,可用 --mapping_file 指定。
限制:对头文件中的宏、被包含头中的模板特化、维持 ODR 链接所需的头文件可能给出错误建议。安全流程为运行 IWYU、用 fix_include 应用、重建并跑测试、回退破坏构建的改动,反复直至干净。可用 grep -rl '#include "expensive.h"' src/ | wc -l 统计编译级联。相关技能包括构建加速、CMake 和 C++20 模块。