Condividi tramite


Avviso del compilatore (livello 1, errore, off) C5262

il fall-through implicito si verifica qui; manca un'istruzione break ? Usare [[fallthrough]] quando un'istruzione break viene intenzionalmente omessa tra i casi

Osservazioni:

Il flusso di controllo che rientra in modo implicito tra i casi di istruzioni switch è un'origine cronologica di bug per C e C++. Sebbene la __fallthrough macro SAL non sia stata utile per la diagnostica del compilatore di compilazione. Poiché i clienti hanno codice legacy che "fall through" a scopo, non è possibile fornire un avviso interattivo senza un modo per indicare un fall through intenzionale. In C++17 l'attributo [[fallthrough]] è stato aggiunto per indicare tale istanza. Il compilatore può prendere in considerazione questo attributo e eliminare il nuovo avviso.

L'avviso del compilatore C5262 è una novità di Visual Studio 2022 versione 17.4 ed è disattivato per impostazione predefinita e considerato come un errore per impostazione predefinita quando è abilitato. Per continuare a supportare il codice legacy senza interruzioni di compilazione, È necessario abilitare in modo esplicito C5262. Per altre informazioni su come abilitare questo avviso, vedere Avvisi del compilatore disattivati per impostazione predefinita.

Esempio

Il codice di esempio mostra la diagnostica per switch i casi che rientrano senza break istruzioni o return o l'attributo [[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++;
*/

Per risolvere questo problema quando il flusso di controllo tra i casi è intenzionale, usare l'attributo [[fallthrough]] .

Vedi anche

switch istruzione (C++)
[[fallthrough]] attributo