【问题标题】:Clang-Tidy `NOLINT` for multiple lines?多行的 Clang-Tidy `NOLINT`?
【发布时间】:2019-08-05 13:03:12
【问题描述】:

我正在开发一个 C++ 项目,该项目有一些自动生成的大段代码,我不想被 linted。有没有类似于//NOLINT 注释的东西可以应用于多行?像下面这样:

// BEGINNOLINT
bad-code;
// ENDNOLINT

我在网上只能找到suggestion that this should be implemented。有什么办法可以避免在每一行的末尾写上// NOLINT

【问题讨论】:

    标签: clang clang-tidy


    【解决方案1】:

    遗憾的是没有直接的方法可以做到这一点,clang-tidy 只支持//NOLINT//NOLINTNEXTLINE

    我不知道您对该代码生成有多少控制权...您可以在一行中生成它,这对您有很大帮助,因为 c++ 不关心空格。

    一个粗略但有效的解决方案是使用像 sed 这样的文本处理工具:

    $ sed -i -re '/^\/\/BEGIN_NOLINT/,/^\/\/END_NOLINT/{s/$/\/\/NOLINT/}' *.cpp
    

    这将在//BEGIN_NOLINT//END_NOLINT cmets 之间的每一行的末尾添加//NOLINT(可能会生成)。

    你也可以带参数运行clang-tidy

    -line-filter='[{"name":"test.cpp","lines":[[1,10],[12,100]]}]'
    

    在此示例中将跳过第 11 行。然而,这很难维护,因为每次在文件中添加/删除行时都需要更新过滤器。如果可能的话,将代码生成到单独的文件中可能是个好主意。

    【讨论】:

      【解决方案2】:

      clang-tidy 14会介绍这个功能:

      // NOLINTBEGIN
      ...
      // NOLINTEND
      

      注意,如果你想禁用特定的警告,end-comment 必须与 begin-comment 匹配:

      // NOLINTBEGIN(check-name)
      ...
      // NOLINTEND(check-name)
      

      【讨论】:

      • 它是否适用于整个包含文件?如// NOLINTBEGIN \\ #include<header> \\ //NOLINTEND ?
      【解决方案3】:

      我确定,当我在 MACRO 上应用 //NOLINTNEXTLINE 时,会跳过整个 MARCO。所以尝试在你的类或函数中实现//NOLINTNEXTLINE

      【讨论】:

        猜你喜欢
        • 2018-10-01
        • 1970-01-01
        • 2021-05-18
        • 2020-06-28
        • 2018-06-01
        • 1970-01-01
        • 2021-10-19
        • 2021-09-06
        • 2018-04-25
        相关资源
        最近更新 更多