longjmp
| Definiert in 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 Ausführungskontext env gespeichert durch einen vorherigen Aufruf von setjmp. Diese Funktion kehrt nicht zurück. Die Kontrolle wird an die Aufrufstelle des Makros setjmp übergeben, 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ückkehr oder durch ein anderes longjmp weiter oben im Stack), ist das Verhalten undefiniert. Mit anderen Worten, es sind nur Longjumps nach oben im Aufrufstack erlaubt.
|
Springe über Threads hinweg (wenn die Funktion, die |
(seit C11) |
|
Wenn zum Zeitpunkt des Aufrufs von setjmp eine VLA oder eine andere Variable mit variabel modifiziertem Typ im Gültigkeitsbereich war und die Kontrolle diesen Gültigkeitsbereich verlassen hat, führt 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) |
Parameter
| env | - | Variable, die sich auf den Ausführungszustand des Programms bezieht, der durch setjmp |
| status | - | der Wert, der von setjmp zurückgegeben werden soll. Wenn er gleich 0 ist, wird stattdessen 1 verwendet
|
Anmerkungen
longjmp ist für die Behandlung unerwarteter Fehlerzustände gedacht, bei denen die Funktion nicht sinnvoll zurückkehren kann. Dies ähnelt der Ausnahmebehandlung in anderen Programmiersprachen.
Beispiel
#include <setjmp.h>
#include <stdio.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
Referenzen
- C23 Standard (ISO/IEC 9899:2024):
- 7.13.2.1 Das longjmp-Makro (S. 283-284)
- 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
Siehe auch
| speichert den Kontext (Funktionsmakro) | |
C++-Dokumentation für longjmp
| |