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
, der durch einen vorherigen Aufruf von
setjmp
gespeichert wurde. Diese Funktion kehrt nicht zurück. Die Steuerung 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 (ob durch Rückkehr oder durch einen anderen
longjmp
weiter oben im Stack), ist das Verhalten undefiniert. Mit anderen Worten sind nur Long Jumps den Aufrufstack hinauf erlaubt.
|
Das Springen über Thread-Grenzen (wenn die Funktion, die
|
(since 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 Bereich verlassen hat,
führt
Beim Zurückspringen im Stack gibt
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 } |
(since C99) |
Inhaltsverzeichnis |
Parameter
| env | - | Variable, die sich auf den Ausführungszustand des Programms bezieht, gespeichert durch setjmp |
| status | - | der Wert, der von setjmp zurückgegeben werden soll. Wenn er gleich 0 ist, wird stattdessen 1 verwendet |
Rückgabewert
(keine)
Hinweise
longjmp
ist für die Behandlung unerwarteter Fehlerbedingungen vorgesehen, bei denen die Funktion nicht sinnvoll zurückkehren kann. Dies ähnelt der Ausnahmebehandlung in anderen Programmiersprachen.
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
Referenzen
- C17-Standard (ISO/IEC 9899:2018):
-
- 7.13.2.1 Die longjmp-Makro (S: 191-192)
- C11-Standard (ISO/IEC 9899:2011):
-
- 7.13.2.1 Die longjmp-Makro (S: 263-264)
- C99-Standard (ISO/IEC 9899:1999):
-
- 7.13.2.1 Die 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
|
|