Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Vermeiden
goto
(es.76)
C++-Kernrichtlinien:
ES.76: Vermeiden von Goto
Die Verwendung von goto
wird häufig als gefährliche und fehleranfällige Praxis angesehen. Es ist nur in generiertem Code zulässig, z. B. in einem Parser, der aus einer Grammatik generiert wurde. Mit modernen C++-Features und Dienstprogrammen, die von der Richtlinien-Supportbibliothek bereitgestellt werden, sollte es einfach sein, ganz zu vermeiden goto
.
Hinweise
- Diese Regel warnt bei jedem Vorkommen von
goto
, auch wenn dies im inaktiven Code geschieht, mit Ausnahme von Vorlagencode, der niemals verwendet wird und daher vom Compiler ignoriert wird. - Warnungen können sich multiplizieren, wenn ein Makro enthält
goto
. Aktuelle Berichtsmechanismen verweisen auf alle Instanzen, in denen ein solches Makro erweitert wird. Es kann häufig an einer Stelle behoben werden, indem das Makro geändert wird, oder die Verwendung zugunsten von besser verwendbaren Mechanismen vermieden wird.
Name der Codeanalyse: NO_GOTO
Beispiel
"Gehe zum Bereinigen" im Makro
#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();
}
"Gehe zum Aufräumen" im Makro, ersetzt durch 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;
// ...
}
}