C++ 属性: fallthrough (C++17 起)

来自cppreference.com
< cpp‎ | language‎ | attributes


 
 
C++ 语言
 
 
属性
(C++23)
(C++14)
fallthrough
(C++17)
(C++20)
(C++17)
(C++11)
(C++20)
 

指示从前一标号直落是有意的,而在发生直落时给出警告的编译器不应诊断它。

语法

[[fallthrough]]

解释

只能应用到空语句以创建 直落语句(fallthrough statement):[[fallthrough]];

直落语句只能用在 switch 语句中,其中待执行的下个语句是该 switch 语句的带 case 或 default 标号的语句。如果直落语句在循环中,那么下个(带标号)语句必须是该循环的同一迭代的一部分。

示例

void f(int n)
{
    void g(), h(), i();
 
    switch (n)
    {
        case 1:
        case 2:
            g();
            [[fallthrough]];
        case 3: // 直落时不警告
            h();
        case 4: // 编译器可在发生直落时警告
            if (n < 3)
            {
                i();
                [[fallthrough]]; // OK
            }
            else
            {
                return;
            }
        case 5:
            while (false)
            {
                [[fallthrough]]; // 非良构:下一语句不是同一迭代的一部分
            }
        case 6:
            [[fallthrough]]; // 非良构:没有后继的 case 或 default 标号
    }
}

缺陷报告

下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。

缺陷报告 应用于 出版时的行为 正确行为
CWG 2406 C++17 [[fallthrough]] 可以在对应的 switch 语句中嵌套的循环中出现 已禁止

引用

  • C++23 标准(ISO/IEC 14882:2024):
  • 9.12.6 Fallthrough attribute [dcl.attr.fallthrough]
  • C++20 标准(ISO/IEC 14882:2020):
  • 9.12.5 Fallthrough attribute [dcl.attr.fallthrough]
  • C++17 标准(ISO/IEC 14882:2017):
  • 10.6.5 Fallthrough attribute [dcl.attr.fallthrough]

参阅