禁用特定宏的 clang-tidy 警告

Joh*_*n W 7 c++ clang-tidy

我有一个实例化全局变量的宏。因此 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\n
Run Code Online (Sandbox Code Playgroud)\n\n

我希望 clang-tidy 停止抱怨这一点。

\n\n

我想尽可能具体。\n我只想为此宏关闭警告。我不想全局关闭警告,那么有人可能会在代码中添加更多此类宏而不会被注意到。 \n另外,我不想添加某些内容(例如 //NOLNT(.. .)) 在每个使用宏的地方,这太麻烦了。

\n\n

或者我是从错误的方向接近这个问题的?我以前曾使用过 pc-lint,这是可能的。

\n

Dan*_*tor 5

我也有同样的问题。我找到了两种方法来做到这一点,遗憾的是,没有一种方法是完美的。

选项 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)

笔记:

  • 需要修改源代码才能使用 nolint 版本
  • UGLY_MACRO如果是多行则不起作用


pab*_*285 1

据我所知这是不可能的。有问题的检查(cert-err58-cpp)没有可配置选项,这意味着它不能在每个宏的基础上禁用,只能全局禁用。

除了修改检查源之外,您这里唯一的选项是// NOLINT(cert-err58-cpp)// NOLINTNEXTLINE(cert-err58-cpp)。后者更容易用于文本搜索和替换,因为您只需要捕获换行符和宏名称。