Kann Goto Funktionen durchlaufen, ohne Destruktoren aufzurufen?
Ein weit verbreitetes Missverständnis besteht weiterhin, dass Goto Codeabschnitte überspringt und so die Ausführung von Destruktoren und Ähnlichem vermeidet Operationen. Dieses Missverständnis ist in Diskussionen rund um C besonders ausgeprägt.
Bereichseinschränkungen
Entgegen der landläufigen Meinung kann goto Funktionsgrenzen nicht überschreiten. Der Versuch, zu einer Beschriftung zu springen, die in einer anderen Funktion definiert ist, führt zu einem Compilerfehler, wie unten dargestellt:
void f() { int x = 0; goto lol; } int main() { f(); lol: return 0; }
Fehler: Beschriftung „lol“ verwendet, aber nicht definiert
Objekt Überlegungen zur Initialisierung
Das Überspringen der Objektinitialisierung ist ebenfalls nicht zulässig. Wenn Sie versuchen, die Initialisierung eines Objekts zu überspringen, meldet der Compiler einen Fehler:
int main() { goto lol; int x = 0; lol: return 0; }
Fehler: Zur Bezeichnung „lol“ springen
Fehler: von hier aus
Fehler: Überschreitet die Initialisierung von 'int x'
Bereichsspezifisch Zerstörung
Objekte mit automatischer Speicherdauer werden beim Verlassen ihres Gültigkeitsbereichs zerstört, unabhängig von der Beendigungsmethode. Goto kann daher die Objektzerstörung nicht umgehen:
struct T { T() { cout << "*T"; } ~T() { cout << "~T"; } }; int main() { { T t; goto lol; } lol: return 0; }
Ausgabe: *T~T
Objekttypbeschränkungen
Beim Springen in den Bereich von nichtskalaren Objekten ist generell verboten, es gibt Ausnahmen für Objekte mit trivialen Standardkonstruktoren und -destruktoren. Array-Deklarationen ohne Initialisierer sind ebenfalls ausgenommen.
Fazit
Goto ist zwar keine Lücke, die die Scoping-Mechanismen von C umgeht, kann aber bei unachtsamer Verwendung zu unvorhergesehenem Verhalten führen. Dennoch bieten die oben beschriebenen Einschränkungen Schutz vor unbeabsichtigter oder schädlicher Goto-Nutzung. Daher ist es nicht von Natur aus böse, wie allgemein angenommen wird, sondern sollte mit Bedacht angewendet werden.
Das obige ist der detaillierte Inhalt vonUmgeht „goto' die Destruktorausführung in C?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!