Compilerwarnung (Stufe 1, Fehler, deaktiviert) C5262
Hier erfolgt ein impliziter Fall-Through. Fehlt eine
break
-Anweisung? Verwenden Sie[[fallthrough]]
, wenn einebreak
-Anweisung zwischen Fällen absichtlich weggelassen wird.
Hinweise
Der Kontrollfluss, der implizit zwischen Fällen von Switch-Anweisungen fällt, ist eine historische Quelle von Fehlern für C und C++. Während wir das __fallthrough
SAL-Makro hatten, war es für die Buildcompilerdiagnose nicht hilfreich. Da Kunden älteren Code haben, der absichtlich durchfällt, ist es nicht praktikabel, eine Warnung mit Aktionen zu senden, ohne eine Möglichkeit, einen absichtlichen Fall durchzuweisen. In C++17 wurde das [[fallthrough]]
Attribut hinzugefügt, um eine solche Instanz anzugeben. Der Compiler kann dieses Attribut berücksichtigen und die neue Warnung unterdrücken.
Compilerwarnung C5262 ist neu in Visual Studio 2022, Version 17.4, und ist standardmäßig deaktiviert und wird standardmäßig als Fehler behandelt, wenn dies aktiviert ist. Um Legacycode weiterhin ohne Buildunterbrechungen zu unterstützen, muss C5262 explizit aktiviert sein. Weitere Informationen zum Aktivieren dieser Warnung finden Sie unter Compilerwarnungen, die standardmäßig deaktiviert sind.
Beispiel
Der Beispielcode zeigt Diagnosen für switch
Fälle, die ohne break
Anweisungen oder return
Attribute [[fallthrough]]
fallen.
// 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++;
*/
Um dieses Problem zu beheben, wenn der Kontrollfluss zwischen Fällen beabsichtigt ist, verwenden Sie das [[fallthrough]]
Attribut.