Avviso del compilatore (livello 1, errore, off) C5262
il fall-through implicito si verifica qui; manca un'istruzione
break
? Usare[[fallthrough]]
quando un'istruzionebreak
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]]
.