Share via


Upozornění kompilátoru (úroveň 1, chyba, vypnuto) C5262

implicitní pád se zde vyskytuje; Chybí break vám příkaz? Použití [[fallthrough]] při break úmyslném vynechání příkazu mezi případy

Poznámky

Tok řízení, který implicitně spadá mezi případy příkazů switch, je historickým zdrojem chyb pro jazyk C i C++. I když jsme měli __fallthrough makro SAL, pro diagnostiku kompilátoru sestavení to nebylo užitečné. Vzhledem k tomu, že zákazníci mají starší kód, který "propadne" účelu, není možné dát upozornění s možností akce bez nějakého způsobu, jak indikovat úmyslné pády. V jazyce C++17 [[fallthrough]] byl atribut přidán k označení takové instance. Kompilátor může tento atribut vzít v úvahu a potlačit nové upozornění.

Upozornění kompilátoru C5262 je v sadě Visual Studio 2022 verze 17.4 nové a ve výchozím nastavení je vypnuté a při povolení se považuje za chybu. Pokud chcete pokračovat v podpoře staršího kódu bez přerušení sestavení, musí být C5262 explicitně povolený. Další informace o povolení tohoto upozornění najdete v tématu Upozornění kompilátoru, která jsou ve výchozím nastavení vypnutá.

Příklad

Ukázkový kód ukazuje diagnostiku případů switch , které procházejí bez break příkazů nebo return[[fallthrough]] atributů.

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

Pokud chcete tento problém vyřešit, když je tok řízení mezi případy úmyslný, použijte [[fallthrough]] atribut.

Viz také

switch – příkaz (C++)
[[fallthrough]] Atribut