Compartilhar via


Aviso do compilador (nível 1, erro, desativado) C5262

a queda implícita ocorre aqui; Está faltando uma break declaração? Use [[fallthrough]] quando uma break declaração é intencionalmente omitida entre os casos

Comentários

O fluxo de controle que cai implicitamente entre casos de instruções de switch é uma fonte histórica de bugs para C e C++. Embora tivéssemos a __fallthrough macro SAL, ela não era útil para o diagnóstico do compilador de compilação. Como os clientes têm código herdado que "cai" de propósito, não é viável dar um aviso acionável sem alguma maneira de indicar uma queda intencional. No C++17, o [[fallthrough]] atributo foi adicionado para indicar tal instância. O compilador pode levar esse atributo em conta e suprimir o novo aviso.

Aviso do compilador C5262 é novo no Visual Studio 2022 versão 17.4 e é desativado por padrão e tratado como um erro por padrão quando habilitado. Para continuar a oferecer suporte a código herdado sem quebras de compilação, o C5262 deve ser explicitamente habilitado. Para obter mais informações sobre como habilitar esse aviso, confira Avisos do compilador desativados por padrão.

Exemplo

O código de exemplo mostra diagnósticos para switch casos que se enquadram em instruções sem break ou return ou o atributo [[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++;
*/

Para resolver esse problema quando o fluxo de controle entre casos é intencional, use o [[fallthrough]] atributo .

Confira também

switch instrução (C++)
[[fallthrough]]atributo