Compartilhar via


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

aqui ocorre um fall-through implícito; você está perdendo uma declaração break? Use [[fallthrough]] quando uma instrução break for intencionalmente omitida entre os casos

Comentários

O fluxo de controle que implicitamente cai entre casos de instruções 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 "falha" de propósito, não é viável fornecer um aviso acionável sem alguma forma de indicar uma falha intencional. No C++17, o [[fallthrough]] atributo foi adicionado para indicar essa instância. O compilador pode levar esse atributo em conta e suprimir o novo aviso.

O aviso do compilador C5262 é novo no Visual Studio 2022 versão 17.4 e está desativado por padrão e é tratado como um erro por padrão quando habilitado. Para continuar a dar suporte ao código herdado sem quebras de build, o C5262 deve ser habilitado explicitamente. 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 without break or return ou o [[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 esse problema quando o fluxo de controle entre ocorrências é intencional, use o [[fallthrough]] atributo.

Confira também

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