【问题标题】:How to make gcc/clang warn about missing breaks in switch statements如何使 gcc/clang 警告 switch 语句中缺少中断
【发布时间】:2012-01-10 19:17:11
【问题描述】:

有什么方法可以让gccclang 对switch 语句中缺少的中断发出警告?

具体来说,我几乎总是希望 case 语句以中断结尾,如果我不这样做,我可以让编译器抱怨,那就太好了。如果它会查找 break 语句或“// fall through”注释,那就更好了。

人们是否有不同的解决方案来帮助自己不搞砸?

【问题讨论】:

标签: gcc coding-style switch-statement clang gcc-warning


【解决方案1】:

对于 Clang 主干,使用 -Wimplicit-fallthrough。如果您使用的是 C++11,则可以使用 [[clang::fallthrough]]; 语句标记有意的失败(有关此属性的更多信息,请参阅 the documentation)。该警告(尚未)检查“通过”cmets。此功能不会出现在即将发布的 Clang 3.1 版本中,但它会(可能!)出现在 3.2 中。

编辑:Clang 的属性现在是 C++17 的一部分,名称为 [[fallthrough]];

【讨论】:

  • 我看到您刚刚在llvm.org/viewvc/llvm-project?view=rev&revision=156086 中检查了此功能。谢谢!感谢 Alexander Kornienko!
  • Alexander 在这里值得称赞,我所做的只是回顾它。 :)
  • C++17 现在具有 [[fallthrough]] 属性。
  • gcc 7 也将具有 -Wimplicit-fallthrough(已包含在 Fedora 26 预发行版中)。有趣的是,我无法让 clang 3.9.1 报告失败,即使它接受了标志。
  • @proski Clang 仅针对可以抑制警告的配置发出警告。否则这对于使用 -Weverything 构建的人来说会非常烦人。
【解决方案2】:

据我所知,这仍然是 gcc 中未分配的功能请求。

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=7652

【讨论】:

    【解决方案3】:

    您问如果它会寻找中断语句或“//失败”评论会很棒。

    还记得 Henry Spencer 的第一个 Ten Commandments for C programmers

    1.你应该经常运行 lint

    看起来您需要的是 PC-Lint / flexelint。这是警告 616:

    616 控制流到 case/default -- 控制落入 case 语句或 default 语句 更多。这是故意的还是程序员忘记插入一个 打破声明?如果这是故意的,请发表评论 紧接在被标记为的语句之前:

    case 'a': a = 0;
       /* fall through */
    case 'b': a++;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-20
      • 1970-01-01
      • 2015-05-16
      • 2018-03-18
      • 2022-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多