【发布时间】:2026-02-15 13:20:02
【问题描述】:
我们正在捕获来自 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 的警告清除跌倒?如果有,那是什么?
【问题讨论】:
-
当您使用 C++17 时,请参阅属性
[[fallthrough]];(注意 - 需要;)来源:en.cppreference.com/w/cpp/language/attributes -
谢谢理查德。不幸的是,不,我们目前不是属性。我们仍然支持回到 C++03。
-std=c++17只是在 Fedora 26 下测试一种配置,因为它提供 GCC 7。但我会接受一个宏来抽象它以实现可移植性。 -
也许
BOOST_FALLTHROUGH可以满足您的需求。 boost.org/doc/libs/master/libs/config/doc/html/boost_config/… -
谢谢@BaummitAugen - 是的,这可能行得通。你会碰巧知道
__has_feature(x)是否适用于此?用__has_feature(fallthrough)测试就够了吗?还是我们需要通过编译器版本测试来做到这一点?还是别的什么? -
@BaummitAugen - 糟糕,我们不使用 Boost。我必须从头开始构建一个等效的宏。这就是其他问题的内容。
标签: c++ gcc switch-statement warnings