命名空间
变体
操作

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

来自 cppreference.com
< cpp‎ | 语言‎ | 属性
 
 
C++ 语言
 
 
属性
(C++23)
(C++14)
fallthrough
(C++17)
(C++20)
(C++17)
(C++11)
(C++20)
 

指示从上一个 case 标签处发生的穿透是故意的,并且编译器不应对此发出关于穿透的警告。

内容

[编辑] 语法

[[fallthrough]]

[编辑] 解释

只能应用于 空语句 以创建穿透语句 ([[fallthrough]];).

穿透语句只能在 switch 语句中使用,其中要执行的下一个语句是具有该 switch 语句的 case 或 default 标签的语句。如果穿透语句位于循环内,则下一个(带标签的)语句必须是该循环的相同迭代的一部分。

[编辑] 示例

void f(int n)
{
    void g(), h(), i();
 
    switch (n)
    {
        case 1:
        case 2:
            g();
            [[fallthrough]];
        case 3: // no warning on fallthrough
            h();
        case 4: // compiler may warn on fallthrough
            if (n < 3)
            {
                i();
                [[fallthrough]]; // OK
            }
            else
            {
                return;
            }
        case 5:
            while (false)
            {
                [[fallthrough]]; // ill-formed: next statement is not
                                 //             part of the same iteration
            }
        case 6:
            [[fallthrough]]; // ill-formed, no subsequent case or default label
    }
}

[编辑] 缺陷报告

以下行为更改缺陷报告被追溯应用于先前发布的 C++ 标准。

DR 应用于 发布的行为 正确的行为
CWG 2406 C++17 [[fallthrough]] 可能会出现在循环中
嵌套在目标 switch 语句中
禁止

[编辑] 参考资料

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

[编辑] 另请参见

C 文档 for fallthrough