我有一个实例化全局变量的宏。因此 clang-tidy 将正确发出“使用静态存储持续时间初始化...可能会引发无法捕获的异常”。
\n\n我可以针对每个宏禁用此警告吗?最好在定义宏的地方内联。
\n\n也就是说,假设我有:
\n\n// header.h\n#define UGLY_MACRO(X) SomeClass X(#X)\n\n// source.cpp\nUGLY_MACRO(SomeName); // clang-tidy complains here\nRun Code Online (Sandbox Code Playgroud)\n\n我希望 clang-tidy 停止抱怨这一点。
\n\n我想尽可能具体。\n我只想为此宏关闭此警告。我不想全局关闭警告,那么有人可能会在代码中添加更多此类宏而不会被注意到。 \n另外,我不想添加某些内容(例如 //NOLNT(.. .)) 在每个使用宏的地方,这太麻烦了。
\n\n或者我是从错误的方向接近这个问题的?我以前曾使用过 pc-lint,这是可能的。
\n我也有同样的问题。我找到了两种方法来做到这一点,遗憾的是,没有一种方法是完美的。
选项 1使用--line-filter命令行参数clang-tidy:
clang-tidy --line-filter='["name":"header.h"]' source.cpp
Run Code Online (Sandbox Code Playgroud)
笔记:
--filter-regex,这甚至适用于宏扩展。header.h(请参阅 的帮助文本--line-filter)选项 2通过包装宏:
#define UGLY_MACRO_NOLINT(...) UGLY_MACRO(__VA_ARGS__) //NOLINT(...)
Run Code Online (Sandbox Code Playgroud)
笔记:
UGLY_MACRO如果是多行则不起作用据我所知这是不可能的。有问题的检查(cert-err58-cpp)没有可配置选项,这意味着它不能在每个宏的基础上禁用,只能全局禁用。
除了修改检查源之外,您这里唯一的选项是// NOLINT(cert-err58-cpp)和// NOLINTNEXTLINE(cert-err58-cpp)。后者更容易用于文本搜索和替换,因为您只需要捕获换行符和宏名称。