Compartir vía


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 una break 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 .

Consulte también

Instrucción switch (C++)
atributo [[fallthrough]]