如何让clang-tidy对间接引入的标准库构造的使用发出警告?
如何让clang-tidy对间接引入的标准库构造的使用发出警告?
你遇到的这种依赖标准库头文件间接引入的情况,确实容易踩坑——换个库版本或者编译器就直接编译失败,太闹心了。想让clang-tidy帮你提前揪出这类问题,有几个实用的办法:
启用
misc-include-cleaner检查器:这个检查器就是专门干这个的——它会扫描你的代码,找出所有你使用了但没有直接包含对应头文件的实体,不管是标准库类型还是自定义类型。运行clang-tidy的时候,你只需要加上检查器参数:-checks='misc-include-cleaner',它就会标记出像std::logic_error这种你用了但没直接包含<stdexcept>的情况,提醒你补上必要的头文件,而不是依赖其他头文件的间接引入。要注意的是,这个检查器需要clang进行完整的语义分析,所以编译的时候得确保是正常的语义分析模式,不能只做语法检查,否则它可能没法准确识别所有未直接包含的实体。
配合编译器严格模式辅助:虽然你要的是clang-tidy的警告,但可以把编译器的
-Wall -Wextra选项加上,和clang-tidy的检查形成双重保险。有些情况下,编译器会对依赖间接引入的实体给出弱提示,clang-tidy则能更明确地把这类风险标记出来。
拿你给出的代码举例:
#include <array> int main() { throw std::logic_error("hi"); }
启用misc-include-cleaner后,clang-tidy就会明确提示你:std::logic_error的定义来自<stdexcept>,但你没有直接包含该头文件,依赖间接引入存在兼容性风险。
备注:内容来源于stack exchange,提问作者einpoklum




