Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
a queda implícita ocorre aqui; Está faltando uma
breakdeclaração? Utilizar[[fallthrough]]quando umabreakdeclaração é intencionalmente omitida entre casos
Observações
O fluxo de controle que cai implicitamente 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 um código legado que "cai" de propósito, não é viável dar um aviso acionável sem alguma maneira de indicar uma queda intencional. Em 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.
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 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, consulte Avisos do compilador que estão desativados por padrão.
Example
O código de exemplo mostra diagnósticos para switch casos que caem sem break instruções ou return 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 casos é intencional, use o [[fallthrough]] atributo.