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.
Evitar
goto(es.76)
Diretrizes principais do C++:
ES.76: Evitar goto
O uso de goto é amplamente considerado uma prática perigosa e propensa a erros. É aceitável apenas em código gerado, como em um analisador gerado a partir de uma gramática. Com recursos e utilitários modernos de C++ fornecidos pela biblioteca Guidelines Support Library, deve ser fácil evitar goto completamente.
Observações
- Esta regra avisa sobre qualquer ocorrência de
goto, ainda que ocorra em código morto, exceto o código de modelogotoque nunca é usado e, portanto, é ignorado pelo compilador. - Os avisos podem se multiplicar quando uma macro contém
goto. Os mecanismos de relatório atuais apontam para todas as instâncias em que essa macro é expandida. Muitas vezes pode ser resolvido num só lugar, alterando a macro ou evitando o seu uso em favor de mecanismos mais fáceis de manter.
Nome da análise de código: NO_GOTO
Exemplo
'goto clean-up' nas macros
#define ENSURE(E, L) if (!(E)) goto L;
void poll(connection &c)
{
ENSURE(c.open(), end); // C26438
while (c.wait())
{
connection::header h{};
connection::signature s{};
ENSURE(c.read_header(h), end); // C26438
ENSURE(c.read_signature(s), end); // C26438
// ...
}
end:
c.close();
}
'goto clean-up' na macro, substituído por gsl::finally
void poll(connection &c)
{
auto end = gsl::finally([&c] { c.close(); });
if (!c.open())
return;
while (c.wait())
{
connection::header h{};
connection::signature s{};
if(!c.read_header(h))
return;
if(!c.read_signature(s))
return;
// ...
}
}