gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 12:45:35 27 4
gpt4 key购买 nike

我们正在捕获来自 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 manual声明使用 __attribute__ ((fallthrough)),但它不可移植。该手册还指出“......也可以添加一条贯穿注释以使警告静音”,但它只提供FALLTHRU(这真的是唯一的选择吗? ):

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

}

是否有一种可移植的方式通过 Clang 和 GCC 的警告清除跌倒?如果有,那是什么?

最佳答案

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

  m_state = BODY;
// fall through
case BODY:

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

fall through 是 GCC 识别的标记之一。这不仅仅是FALLTHRU。如需完整列表,请参阅 -Wimplicit-fallthrough option 的文档。 .另见 posting on the Red Hat Developer blog .

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

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

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

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

关于c++ - GCC 7,-Wimplicit-fallthrough 警告,以及清除它们的便携方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45129741/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com