Freigeben über


Verwenden von "setjmp/longjmp"

Wenn setjmp und longjmp zusammen verwendet werden, bieten sie die Möglichkeit, goto (nicht lokal) auszuführen. Sie werden in der Regel verwendet, um die Ausführungssteuerung an den Fehlerbehandlungs- oder Wiederherstellungscode in einer vorher aufgerufenen Routine zu übergeben, ohne die standardmäßigen Aufruf- oder Rückgabekonventionen zu verwenden.

Warnung

setjmp und longjmp unterstützen jedoch die C++-Objektsemantik nicht und beeinträchtigen möglicherweise die Leistung, indem sie die Optimierung für lokale Variablen verhindern. Aus diesem Grund wird empfohlen, sie nicht in C++-Programmen zu verwenden.Es wird empfohlen, stattdessen try/catch-Konstrukte zu verwenden.

Wenn Sie sich entscheiden, setjmp/longjmp in einem C++-Programm zu verwenden, schließen Sie auch SETJMP.H oder SETJMPEX.H ein, um eine ordnungsgemäße Interaktion zwischen den Funktionen und der C++-Ausnahmebehandlung sicherzustellen. Wenn Sie /EH für das Kompilieren verwenden, werden während der Stapelentladung Destruktoren für lokale Objekte aufgerufen. Wenn Sie /EHs zum Kompilieren verwenden und eine Ihrer Funktionen eine Funktion aufruft, die nothrow verwendet, und die Funktion, die nothrow verwendet, longjmp aufruft, dann findet, abhängig vom Optimierer, die Destruktorentladung möglicherweise nicht statt.

In portablem Code ist bei Ausführung eines nicht lokalen goto, das longjmp aufruft, die ordnungsgemäße Zerstörung von framebasierten Objekten möglicherweise unzuverlässig.

Siehe auch

Referenz

Kombination von C (strukturiert)- und C++-Ausnahmen