Namespaces
Variants

C++ attribute: fallthrough (since C++17)

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous
Attributes
(C++23)
(C++11) (until C++26)
(C++14)
fallthrough
(C++17)
(C++20)
(C++17)
(C++11)
(C++20)

Указывает, что переход к следующей метке case из предыдущей является преднамеренным и не должен диагностироваться компилятором, который выдает предупреждения о сквозном выполнении.

Содержание

Синтаксис

[ [ fallthrough ] ]

Объяснение

Может применяться только к null statement для создания fallthrough statement ( [ [ fallthrough ] ] ; ).

Оператор fallthrough может использоваться только в switch операторе, когда следующей выполняемой инструкцией является инструкция с case или default меткой для данного оператора switch. Если оператор fallthrough находится внутри цикла, следующая (помеченная) инструкция должна быть частью той же итерации этого цикла.

Пример

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 Атрибут Fallthrough [dcl.attr.fallthrough]
  • Стандарт C++20 (ISO/IEC 14882:2020):
  • 9.12.5 Атрибут Fallthrough [dcl.attr.fallthrough]
  • Стандарт C++17 (ISO/IEC 14882:2017):
  • 10.6.5 Атрибут Fallthrough [dcl.attr.fallthrough]

Смотрите также

C documentation для fallthrough