__try, try/catch/finally in C verstehen
In C werden die try/catch/finally-Blöcke typischerweise für die Ausnahmebehandlung verwendet . Es gibt jedoch eine alternative Syntax mit doppelten Unterstrichen, __try, die spezifisch für Windows ist.
Wann __try verwendet werden sollte
Unter Windows wird die Ausnahmebehandlung über Structured implementiert Ausnahmebehandlung (SEH). Bei der Ausrichtung auf Windows mit MSVC-Compilern kann die __try-Syntax verwendet werden, um SEH-Ausnahmen abzufangen.
SEH- und C-Ausnahmen
Der MSVC-Compiler generiert Code, der C-Ausnahmen zuordnet der SEH-Infrastruktur unter Verwendung des Ausnahmecodes 0xe06d7363 („msc“). Dadurch können C-Destruktoren aufgerufen werden, wenn eine SEH-Ausnahme ausgelöst wird.
Compiler-Optimierung für Destruktoren
Der MSVC-Compiler optimiert den Code, um die Generierung des Destruktorcodes zu vermeiden, falls vorhanden keine throw-Anweisung innerhalb der Lebensdauer des Objekts. Diese Optimierung kann mithilfe der Kompilierungsoption /EHa unterdrückt werden, die erforderlich ist, um alle SEH-Ausnahmen konsistent abzufangen.
SEH-Ausnahmetypen
SEH hat viele Ausnahmetypen, einschließlich der vom Betriebssystem definierten und der von bestimmten Anwendungen verwendeten. Verwaltete Ausnahmen wie .NET-Ausnahmen verwenden den Ausnahmecode 0xe0434f4d („com“).
__try, __exclusive und __finally
Um SEH-Ausnahmen abzufangen, __try wird in Verbindung mit __exclusive verwendet, das sich wie ein C-Catch-Block verhält, jedoch über mehr Funktionen verfügt. __finally ermöglicht die Ausführung von Code nach der Ausnahmebehandlung.
Beispielcode
Der bereitgestellte Code demonstriert die Verwendung von __try, __exclusive und __finally, um beide SEH-Ausnahmen abzufangen (verursacht durch den Zugriff auf einen Nullzeiger) und C-Ausnahmen (verursacht durch das Auslösen einer Ganzzahl).
Die Die Ausgabe zeigt, dass die Destruktoren für beide Ausnahmen aufgerufen werden und dass __exclusive die Ausnahmen erfolgreich abfängt.
Das obige ist der detaillierte Inhalt vonWas ist der Zweck und die Implementierung von __try in C unter Windows?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!