Namensräume
Varianten
Aktionen

C++ Attribut: fallthrough (seit C++17)

Von cppreference.com
< cpp‎ | language‎ | attributes
 
 
C++ Sprache
Allgemeine Themen
Kontrollfluss
Bedingte Ausführungsaussagen
if
Iterationsanweisungen (Schleifen)
for
Bereichs-for (C++11)
Sprunganweisungen
Funktionen
Funktionsdeklaration
Lambda-Funktionsausdruck
inline-Spezifizierer
Dynamische Ausnahmespezifikationen (bis C++17*)
noexcept-Spezifizierer (C++11)
Ausnahmen
Namensräume
Typen
Spezifizierer
const/volatile
decltype (C++11)
auto (C++11)
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Speicherdauer-Spezifizierer
Initialisierung
Ausdrücke
Alternative Darstellungen
Literale
Boolesch - Ganzzahl - Gleitkommazahl
Zeichen - String - nullptr (C++11)
Benutzerdefinierte (C++11)
Dienstprogramme
Attribute (C++11)
Typen
typedef-Deklaration
Typalias-Deklaration (C++11)
Umwandlungen
Speicherzuweisung
Klassen
Klassenspezifische Funktionseigenschaften
explicit (C++11)
static

Spezielle Member-Funktionen
Templates
Sonstiges
 
 
Attribute
(C++23)
(C++11)(bis C++26)
(C++14)
fallthrough
(C++17)
(C++20)
(C++17)
(C++11)
(C++20)
 

Zeigt an, dass der Fallthrough vom vorherigen Case-Label beabsichtigt ist und nicht von einem Compiler diagnostiziert werden sollte, der vor Fallthrough warnt.

Inhalt

[bearbeiten] Syntax

[[fallthrough]]

[bearbeiten] Erklärung

Darf nur auf eine Null-Anweisung angewendet werden, um eine Fallthrough-Anweisung zu erstellen ([[fallthrough]];).

Eine Fallthrough-Anweisung darf nur in einer switch-Anweisung verwendet werden, wobei die nächste auszuführende Anweisung eine Anweisung mit einem Case- oder Default-Label für diese switch-Anweisung ist. Wenn sich die Fallthrough-Anweisung innerhalb einer Schleife befindet, muss die nächste (gelabelte) Anweisung Teil derselben Iteration dieser Schleife sein.

[bearbeiten] Beispiel

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
    }
}

[bearbeiten] Fehlerberichte

Die folgenden Verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.

DR angewendet auf Verhalten wie veröffentlicht Korrigiertes Verhalten
CWG 2406 C++17 [[fallthrough]] konnte in einer Schleife erscheinen
verschachtelt innerhalb der Ziel-Switch-Anweisung
verboten

[bearbeiten] Referenzen

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

[bearbeiten] Siehe auch

C-Dokumentation für fallthrough