longjmp
| Definiert im Header <setjmp.h> |
||
| void longjmp( jmp_buf env, int status ); |
(bis C11) | |
| _Noreturn void longjmp( jmp_buf env, int status ); |
(seit C11) (bis C23) |
|
| [[noreturn]] void longjmp( jmp_buf env, int status ); |
(seit C23) | |
Lädt den von einem früheren Aufruf von setjmp gespeicherten Ausführungskontext env. Diese Funktion kehrt nicht zurück. Die Kontrolle wird an die Aufrufstelle des Makros setjmp übertragen, das env eingerichtet hat. Dieses setjmp gibt dann den Wert zurück, der als status übergeben wurde.
Wenn die Funktion, die setjmp aufgerufen hat, beendet wurde (entweder durch Rückgabe oder durch einen anderen longjmp weiter oben im Stack), ist das Verhalten undefiniert. Mit anderen Worten, nur Sprünge im Aufruf-Stack sind erlaubt.
|
Ein Sprung zwischen Threads (wenn die Funktion, die |
(seit C11) |
|
Wenn zum Zeitpunkt des Aufrufs von setjmp eine VLA oder eine andere variabel modifizierte Typvariablen im Geltungsbereich war und die Kontrolle diesen Geltungsbereich verlassen hat, ruft Auf dem Weg nach oben im Stack deallokiert void g(int n) { int a[n]; // a may remain allocated h(n); // does not return } void h(int n) { int b[n]; // b may remain allocated longjmp(buf, 2); // might cause a memory leak for h's b and g's a } |
(seit C99) |
Inhalt |
[bearbeiten] Parameter
| env | - | Variable, die den von setjmp gespeicherten Ausführungszustand des Programms referenziert |
| status | - | der Wert, der von setjmp zurückgegeben werden soll. Wenn er gleich 0 ist, wird stattdessen 1 verwendet. |
[bearbeiten] Rückgabewert
(keine)
[bearbeiten] Hinweise
longjmp ist für die Handhabung unerwarteter Fehlerbedingungen vorgesehen, bei denen die Funktion nicht sinnvoll zurückkehren kann. Dies ähnelt der Ausnahmebehandlung in anderen Programmiersprachen.
[bearbeiten] Beispiel
#include <stdio.h> #include <setjmp.h> #include <stdnoreturn.h> jmp_buf my_jump_buffer; noreturn void foo(int status) { printf("foo(%d) called\n", status); longjmp(my_jump_buffer, status + 1); // will return status+1 out of setjmp } int main(void) { volatile int count = 0; // modified local vars in setjmp scope must be volatile if (setjmp(my_jump_buffer) != 5) // compare against constant in an if foo(++count); }
Ausgabe
foo(1) called foo(2) called foo(3) called foo(4) called
[bearbeiten] Referenzen
- C17-Standard (ISO/IEC 9899:2018)
- 7.13.2.1 Das longjmp-Makro (S. 191-192)
- C11-Standard (ISO/IEC 9899:2011)
- 7.13.2.1 Das longjmp-Makro (S. 263-264)
- C99-Standard (ISO/IEC 9899:1999)
- 7.13.2.1 Das longjmp-Makro (S. 244-245)
- C89/C90-Standard (ISO/IEC 9899:1990)
- 4.6.2.1 Die longjmp-Funktion
[bearbeiten] Siehe auch
| speichert den Kontext (Makro-Funktion) | |
| C++-Dokumentation für longjmp
| |