GCC 7,-Wimplicit-fallthrough 警告,以及清除它们的便携方式?

新手上路,请多包涵

我们正在从 GCC 7 中捕获关于 switch 语句中隐式失败的警告。以前,我们在 Clang 下清除了它们(这就是下面看到评论的原因):

 g++ -DNDEBUG -g2 -O3 -std=c++17 -Wall -Wextra -fPIC -c authenc.cpp
asn.cpp: In member function ‘void EncodedObjectFilter::Put(const byte*, size_t)’:
asn.cpp:359:18: warning: this statement may fall through [-Wimplicit-fallthrough=]
    m_state = BODY;  // fall through
                  ^
asn.cpp:361:3: note: here
   case BODY:
   ^~~~

GCC 手册 声明使用 __attribute__ ((fallthrough)) ,但它不可移植。该手册还指出 “……也可以添加一条失败的评论来消除警告” ,但它只提供 FALLTHRU (这真的是唯一的选择吗?):

 switch (cond)
  {
  case 1:
    bar (0);
    /* FALLTHRU */
  default:
    …
  }

是否有一种便携式方法可以通过 Clang 和 GCC 的警告来清除跌倒?如果是这样,那是什么?

原文由 jww 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.6k
2 个回答

GCC 期望标记注释出现在自己的行中,如下所示:

   m_state = BODY;
  // fall through
case BODY:

标记也必须在 case 标签之前;不能有中间的右大括号 }

fall through 是 GCC 识别的标记之一。这不仅仅是 FALLTHRU 。如需完整列表,请参阅 -Wimplicit-fallthrough 选项 的文档。另请参阅 Red Hat 开发人员博客上的此帖子

C++17 增加了一个 [[fallthrough]] 属性,可用于抑制此类警告。注意结尾的分号:

   m_state = BODY;
  [[fallthrough]];
case BODY:

Clang 支持 -Wimplicit-fallthrough 警告,但不支持它们作为 -Wall-Wextra 的一部分。 Clang 不识别注释标记,因此必须使用基于属性的抑制(这当前意味着 C 前端的非标准 __attribute__((fallthrough)) 构造)。

请注意,仅当编译器实际看到该注释时,才使用标记注释抑制警告。如果预处理器单独运行,则需要指示它保留注释,就像 GCC 的 -C 选项 一样。例如,为了避免 ccache 出现虚假警告,您需要在编译时指定 -C 标志,或者,对于最新版本的 ccache,使用 keep_comments_cpp 选项。

原文由 Florian Weimer 发布,翻译遵循 CC BY-SA 4.0 许可协议

没有人提到完全禁用警告,这可能不是 OP 正在寻找的答案,但我认为它应该包括在内以保持完整性,因为它也适用于两个编译器:

-Wno-implicit-fallthrough

如果由于某种原因您无法更改源代码,这会使编译输出保持干净,从而可以清楚地了解其他问题(但当然必须知道自己会丢失什么)。

原文由 stefanct 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题