禁用特定宏的整洁警告

时间:2020-04-04 16:37:34

标签: c++ clang-tidy

我有一个实例化全局变量的宏。因此,clang-tidy将正确地发出“静态存储持续时间...的初始化可能会引发无法捕获的异常”。

我可以逐个禁用此警告吗?在定义宏的位置最好使用内联。

也就是说,我有:

// header.h
#define UGLY_MACRO(X)  SomeClass X(#X)

// source.cpp
UGLY_MACRO(SomeName); // clang-tidy complains here

我希望clang-tidy不再抱怨此事。

我想尽可能具体。 我只想对 this 宏发出 this 警告。我不想在全球范围内发出警告,因此有人可能会在未注意到的情况下将更多此类宏添加到代码中。 另外,我不想在每个使用宏的地方添加一些东西(例如// NOLNT(...)),这太麻烦了。

还是我从错误的方向来处理这个问题?在可能的情况下,我曾经与pc-lint合作。

2 个答案:

答案 0 :(得分:1)

据我所知这是不可能的。有问题的支票(cert-err58-cpp)没有可配置的选项,这意味着不能逐个宏禁用它,而只能全局禁用。

保存用于修改支票来源的唯一选项是\\NOLINT(cert-err58-cpp)\\NOLINTNEXTLINE(cert-err58-cpp)。后者在文本搜索和替换时更容易使用,因为您只需要捕获换行符并紧跟宏名称即可。

答案 1 :(得分:0)

我有同样的问题。可悲的是,我发现了两种方法,但没有一种是完美的。

通过对--line-filter使用clang-tidy命令行参数来

选项1

clang-tidy --line-filter='["name":"header.h"]' source.cpp

注意:

  • 可悲的是,这不会选择性地仅对一个警告起作用,它会禁用所有警告。
  • --filter-regex不同,这甚至可以用于宏扩展。
  • 您可以更具体一些,并在header.h中指定要为其禁用警告的行号范围(请参见--line-filter的帮助文本)

选项2 ,方法是包装宏:

#define UGLY_MACRO_NOLINT(...) UGLY_MACRO(__VA_ARGS__) //NOLINT(...)

注意:

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