Advertencia del compilador (nivel 1, error, desactivado) C5262
la caída implícita se produce aquí; ¿Falta una
break
declaración? Se usa[[fallthrough]]
cuando se omite intencionadamente unabreak
instrucción entre casos
Comentarios
El flujo de control que se encuentra implícitamente entre los casos de instrucciones switch es un origen histórico de errores para C y C++. Aunque teníamos la __fallthrough
macro SAL, no era útil para los diagnósticos del compilador de compilación. Dado que los clientes tienen código heredado que "pasa" a propósito, no es viable proporcionar una advertencia accionable sin alguna manera de indicar una caída intencionada. En C++17, el [[fallthrough]]
atributo se agregó para indicar dicha instancia. El compilador puede tener en cuenta este atributo y suprimir la nueva advertencia.
La advertencia del compilador C5262 es nueva en La versión 17.4 de Visual Studio 2022 y está desactivada de forma predeterminada y se trata como un error de forma predeterminada cuando está habilitada. Para seguir admitiendo código heredado sin interrupciones de compilación, C5262 debe estar habilitado explícitamente. Para obtener más información sobre cómo habilitar esta advertencia, consulte Advertencias del compilador desactivadas de forma predeterminada.
Ejemplo
El código de ejemplo muestra diagnósticos para switch
los casos en los que se encuentran sin break
instrucciones o sin instrucciones return
o el [[fallthrough]]
atributo .
// 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++;
*/
Para resolver este problema cuando el flujo de control entre casos es intencional, use el [[fallthrough]]
atributo .