Freigeben über


Compilerwarnung (Ebene 1, Fehler, aus) C5262

Impliziter Fall-Through erfolgt hier; fehlt ihnen eine break Anweisung? Verwenden, [[fallthrough]] wenn eine break Anweisung zwischen Fällen absichtlich weggelassen wird

Hinweise

Der Kontrollfluss, der implizit zwischen Fällen von Switch-Anweisungen fällt, ist eine historische Quelle von Fehlern für C und C++. Während wir das __fallthrough SAL-Makro hatten, war es für den Buildcompiler Diagnose nicht hilfreich. Da Kunden älteren Code haben, der absichtlich durchfällt, ist es nicht praktikabel, eine Warnung mit Aktionen zu senden, ohne eine Möglichkeit, einen absichtlichen Fall durchzuweisen. In C++17 wurde das [[fallthrough]] Attribut hinzugefügt, um eine solche Instanz anzugeben. Der Compiler kann dieses Attribut berücksichtigen und die neue Warnung unterdrücken.

Compilerwarnung C5262 ist neu in Visual Studio 2022, Version 17.4, und ist standardmäßig deaktiviert und wird standardmäßig als Fehler behandelt, wenn dies aktiviert ist. Um Legacycode weiterhin ohne Buildunterbrechungen zu unterstützen, muss C5262 explizit aktiviert sein. Weitere Informationen zum Aktivieren dieser Warnung finden Sie unter Compilerwarnungen, die standardmäßig deaktiviert sind.

Beispiel

Der Beispielcode zeigt Diagnose für switch Fälle, die ohne break anweisungen oder return das [[fallthrough]] Attribut durchlaufen werden.

// C5262.cpp
// compile using /std:c++17 /we5262

int main(int argc, char** argv)
{
    switch (argc)
    {
        case 0: ++argv;
        case 1:
        case 2: argv++;
        default:
            argv = 0;
    }
}

/*
When built, the compiler produces this output:

.\C5262.cpp(9,9): error C5262: implicit fall-through occurs here; are you missing a break statement? Use [[fallthrough]] when a break statement is intentionally omitted between cases
        case 1:
        ^
.\C5262.cpp(8,17): note: statement that may fall through is here
        case 0: ++argv;
                ^
.\C5262.cpp(11,9): error C5262: implicit fall-through occurs here; are you missing a break statement? Use [[fallthrough]] when a break statement is intentionally omitted between cases
        default:
        ^
.\C5262.cpp(10,17): note: statement that may fall through is here
        case 2: argv++;
*/

Um dieses Problem zu beheben, wenn der Kontrollfluss zwischen Fällen beabsichtigt ist, verwenden Sie das [[fallthrough]] Attribut.

Siehe auch

switch-Anweisung (C++)
[[fallthrough]]-Attribut