Dela via


Kompilatorvarning (nivå 1, fel, av) C5262

implicita fall-through sker här; Saknar du en break instruktion? Använd [[fallthrough]] när en break instruktion avsiktligt utelämnas mellan ärenden

Anmärkningar

Kontrollflöde som implicit faller mellan fall av växelinstruktioner är en historisk källa till buggar för både C och C++. Även om vi hade __fallthrough SAL-makrot var det inte användbart för build-compiler-diagnostiken. Eftersom kunder har äldre kod som "faller igenom" med flit är det inte möjligt att ge en åtgärdsvarning utan något sätt att indikera ett avsiktligt fall. I C++17 [[fallthrough]] lades attributet till för att indikera en sådan instans. Kompilatorn kan ta hänsyn till det här attributet och utelämna den nya varningen.

Kompilatorvarning C5262 är ny i Visual Studio 2022 version 17.4 och är både avstängd som standard och behandlas som ett fel som standard när det är aktiverat. Om du vill fortsätta att stödja äldre kod utan byggbrytningar måste C5262 uttryckligen aktiveras. Mer information om hur du aktiverar den här varningen finns i Kompilatorvarningar som är inaktiverade som standard.

Example

Exempelkoden visar diagnostik för switch fall som faller igenom utan break eller return instruktioner eller attributet [[fallthrough]] .

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

Använd attributet för att lösa det här problemet när kontrollflödet mellan fallen är avsiktligt [[fallthrough]] .

Se även

switch instruktion (C++)
[[fallthrough]] attribut