Teilen über


longjmp

Stellt das von einem setjmp Aufruf festgelegte Gebietsschema der Stapelumgebung und des Ausführungsgebietsschemas wieder her.

Syntax

void longjmp(
   jmp_buf env,
   int value
);

Parameter

env
Variable, in der die Umgebung gespeichert wird.

value
Der Wert, der dem Aufruf setjmp zurückgegeben wird.

Hinweise

Die Funktion longjmp stellt eine Stapelumgebung und das Ausführungsgebietsschema wieder her, was zuvor von setjmp in env gespeichert wurde. setjmpund longjmp bieten eine Möglichkeit, eine nicht lokale gotoMethode auszuführen. Sie werden in der Regel verwendet, um die Ausführungskontrolle an die Fehlerbehandlung oder Wiederherstellungscode in einer zuvor aufgerufenen Routine zu übergeben, ohne die normalen Aufruf- und Rückgabekonventionen zu verwenden.

Ein Aufruf von setjmp speichert die aktuelle Stapelumgebung in env. Ein nachfolgender Aufruf von longjmp stellt die gespeicherte Umgebung wieder her und übergibt die Steuerung an den Punkt sofort nach dem entsprechenden setjmp-Aufruf. Die Ausführung wird fortgesetzt, als ob value vom setjmp Anruf zurückgegeben wurde. Die Werte aller Variablen (mit Ausnahme der Variablen „register“), die für die für das Steuerelement zur Routineerfassung zugänglich sind, erhalten die ursprünglichen Werte des longjmp-Aufrufs. Die Werte der Registervariablen sind unvorhersehbar. Der Wert, der von setjmp zurückgegeben wird, muss ungleich null sein. Wenn value als 0 übergeben wird, wird der Wert 1 in der tatsächlichen Rückgabe ersetzt.

Microsoft-spezifisch

In Microsoft C++-Code unter Windows longjmp wird die gleiche Stapelentspannsemantik wie Ausnahmebehandlungscode verwendet. Es ist sicher, an den gleichen Stellen zu verwenden, an denen C++-Ausnahmen ausgelöst werden können. Diese Verwendung ist jedoch nicht portierbar und enthält einige wichtige Einschränkungen.

Rufen Sie longjmp nur vor der Funktion auf, die aufgerufen wird setjmp . Andernfalls sind die Ergebnisse unvorhersehbar.

Beachten Sie außerdem die folgenden Einschränkungen, wenn Sie longjmp verwenden:

  • Gehen Sie nicht davon aus, dass die Werte der Registervariablen gleich sind Standard. Die Werte der Registervariablen in der Routine, die setjmp aufrufen, können nicht mehr auf die richtigen Werte wiederhergestellt werden, nachdem longjmp ausgeführt wurde.

  • Verwenden longjmp Sie die Steuerung nicht aus einer Unterbrechungsbehandlungsroutine, es sei denn, der Interrupt wird durch eine Gleitkommaausnahme verursacht. In diesem Fall kann ein Programm aus einem Interrupthandler über longjmp zurückgegeben werden, wenn das mathematische Gleitkommazahlpaket durch Aufrufen von _fpreset erneut initialisiert wird.

  • Verwenden longjmp Sie nicht, um die Steuerung von einer Rückrufroutine zu übertragen, die direkt oder indirekt von Windows-Code aufgerufen wird.

  • Wenn der Code mithilfe von /EHs oder /EHsc kompiliert wird und die Funktion, die den longjmp Aufruf enthält, lautet noexcept, werden lokale Objekte in dieser Funktion möglicherweise während des Stapels nicht destruktiert.

Ende Microsoft-spezifisch

Hinweis

Im portablen C++-Code können Sie keine C++-Objektsemantik annehmen setjmp und longjmp unterstützen. Insbesondere weist ein setjmplongjmp/Aufrufpaar ein nicht definiertes Verhalten auf, wenn die und durch catch die setjmp nicht longjmp trivialen Destruktoren für alle automatischen Objekte ersetzt und throw aufgerufen werden. In C++-Programmen wird empfohlen, den C++-Ausnahmebehandlungsmechanismus zu verwenden.

Weitere Informationen finden Sie unter Verwenden von „setjmp/longjmp“.

Anforderungen

Routine Erforderlicher Header
longjmp <setjmp.h>

Weitere Informationen zur Kompatibilität finden Sie unter Kompatibilität.

Beispiel

Sehen Sie sich das Beispiel für _fpreset.

Siehe auch

Prozess- und Umgebungskontrollesetjmp