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)

Indique que la chute depuis l'étiquette de cas précédente est intentionnelle et ne devrait pas être diagnostiquée par un compilateur qui avertit sur les chutes.

Table des matières

Syntaxe

[ [ fallthrough ] ]

Explication

Ne peut être appliqué qu'à une instruction nulle pour créer une instruction fallthrough ( [ [ fallthrough ] ] ; ).

Une instruction fallthrough ne peut être utilisée que dans une switch statement, où la prochaine instruction à exécuter est une instruction avec un label case ou default pour cette instruction switch. Si l'instruction fallthrough est à l'intérieur d'une boucle, la prochaine instruction (étiquetée) doit faire partie de la même itération de cette boucle.

Exemple

void f(int n)
{
    void g(), h(), i();
    switch (n)
    {
        case 1:
        case 2:
            g();
            [[fallthrough]];
        case 3: // aucun avertissement sur le fallthrough
            h();
        case 4: // le compilateur peut avertir sur le fallthrough
            if (n < 3)
            {
                i();
                [[fallthrough]]; // OK
            }
            else
            {
                return;
            }
        case 5:
            while (false)
            {
                [[fallthrough]]; // incorrect : l'instruction suivante ne fait pas
                                 //             partie de la même itération
            }
        case 6:
            [[fallthrough]]; // incorrect, aucun label case ou default suivant
    }
}

Rapports de défauts

Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.

DR S'applique à Comportement publié Comportement corrigé
CWG 2406 C++17 [ [ fallthrough ] ] pouvait apparaître dans une boucle
imbriquée dans l'instruction switch cible
interdit

Références

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

Voir aussi

Documentation C pour fallthrough