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. setjmp
und longjmp
bieten eine Möglichkeit, eine nicht lokale goto
Methode 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 unverändert bleiben. Die Werte der Registervariablen in der Routine, die
setjmp
aufrufen, können nicht mehr auf die richtigen Werte wiederhergestellt werden, nachdemlongjmp
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 überlongjmp
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, lautetnoexcept
, 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 setjmp
longjmp
/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
Ein Beispiel hierfür finden Sie unter _fpreset
.