我们正在从 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 许可协议
GCC 期望标记注释出现在自己的行中,如下所示:
标记也必须在
case
标签之前;不能有中间的右大括号}
。fall through
是 GCC 识别的标记之一。这不仅仅是FALLTHRU
。如需完整列表,请参阅-Wimplicit-fallthrough
选项 的文档。另请参阅 Red Hat 开发人员博客上的此帖子。C++17 增加了一个
[[fallthrough]]
属性,可用于抑制此类警告。注意结尾的分号:Clang 支持
-Wimplicit-fallthrough
警告,但不支持它们作为-Wall
或-Wextra
的一部分。 Clang 不识别注释标记,因此必须使用基于属性的抑制(这当前意味着 C 前端的非标准__attribute__((fallthrough))
构造)。请注意,仅当编译器实际看到该注释时,才使用标记注释抑制警告。如果预处理器单独运行,则需要指示它保留注释,就像 GCC 的
-C
选项 一样。例如,为了避免 ccache 出现虚假警告,您需要在编译时指定-C
标志,或者,对于最新版本的 ccache,使用keep_comments_cpp
选项。