Verwenden von Setjmp und longjmp

Wenn setjmp und longjmp zusammen verwendet werden, bieten sie eine Möglichkeit zum Ausführen einer nicht lokalen goto. Sie werden in der Regel in C-Code verwendet, um die Ausführungskontrolle an die Fehlerbehandlung oder Wiederherstellungscode in einer zuvor aufgerufenen Routine zu übergeben, ohne die Standardkonventionen für Aufrufe oder Rückgabekonventionen zu verwenden.

Achtung

longjmp Da setjmp und nicht die korrekte Zerstörung von Stapelframeobjekten portabel zwischen C++-Compilern unterstützt wird und sie die Leistung beeinträchtigen können, indem sie die Optimierung lokaler Variablen verhindern, wird die Verwendung in C++-Programmen nicht empfohlen. Es wird empfohlen, stattdessen Konstrukte zu verwenden und catch zu erstellentry.

Wenn Sie sich für die Verwendung setjmp und longjmp in einem C++-Programm entscheiden, schließen Sie <auch setjmp.h> oder <setjmpex.h> ein, um die korrekte Interaktion zwischen den Funktionen und der Strukturierten Ausnahmebehandlung (SEH) oder C++-Ausnahmebehandlung zu gewährleisten.

Microsoft-spezifisch

Wenn Sie eine /EH-Option zum Kompilieren von C++-Code verwenden, werden Destruktoren für lokale Objekte während der Stapelaussetzung aufgerufen. Wenn Sie jedoch /EHs oder /EHsc zum Kompilieren verwenden und eine Ihrer Funktionen, die keineExcept-Aufrufelongjmpverwendet, tritt der Destruktor für diese Funktion je nach Optimiererzustand möglicherweise nicht auf.

Wenn ein Aufruf ausgeführt wird, wird bei ausführung eines longjmp Aufrufs die korrekte Zerstörung framebasierter Objekte explizit nicht durch den Standard garantiert und kann von anderen Compilern nicht unterstützt werden. Um Sie darüber zu informieren, führt ein Aufruf zur setjmp Warnung C4611 zu einer Warnung: Die Interaktion zwischen "_setjmp" und C++-Objektvernichtung ist nicht portierbar.

Ende Microsoft-spezifisch

Siehe auch

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