Delen via


Compilerwaarschuwing (niveau 1, fout, uit) C5262

impliciete fall-through vindt hier plaats; Mist u een break verklaring? Gebruiken [[fallthrough]] wanneer een break instructie opzettelijk wordt weggelaten tussen gevallen

Opmerkingen

Controlestroom die impliciet valt tussen gevallen van switchinstructies is een historische bron van bugs voor zowel C als C++. Hoewel we de SAL-macro hadden, was het niet nuttig voor de diagnostische gegevens van de __fallthrough build-compiler. Omdat klanten verouderde code hebben die doelbewust 'doorloopt', is het niet mogelijk om een bruikbare waarschuwing te geven zonder een manier om een opzettelijke val aan te geven. In C++17 is het [[fallthrough]] kenmerk toegevoegd om een dergelijk exemplaar aan te geven. De compiler kan rekening houden met dit kenmerk en de nieuwe waarschuwing onderdrukken.

Compilerwaarschuwing C5262 is nieuw in Visual Studio 2022 versie 17.4 en is standaard uitgeschakeld en wordt standaard behandeld als een fout wanneer deze is ingeschakeld. Als u verouderde code zonder build-einden wilt blijven ondersteunen, moet C5262 expliciet zijn ingeschakeld. Zie Compiler-waarschuwingen die standaard zijn uitgeschakeld voor meer informatie over het inschakelen van deze waarschuwing.

Example

De voorbeeldcode toont diagnostische gegevens voor switch gevallen die zonder break of return instructies of het [[fallthrough]] kenmerk vallen.

// 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++;
*/

Gebruik het [[fallthrough]] kenmerk om dit probleem op te lossen wanneer de controlestroom tussen gevallen opzettelijk is.

Zie ook

switch instructie (C++)
[[fallthrough]] kenmerk