setjmp
|
Definiert im Header
<setjmp.h>
|
||
|
#define setjmp(env) /* implementation-defined */
|
||
Speichert den aktuellen Ausführungskontext in einer Variable
env
vom Typ
jmp_buf
. Diese Variable kann später verwendet werden, um den aktuellen Ausführungskontext durch die
longjmp
-Funktion wiederherzustellen. Das bedeutet, wenn ein Aufruf der
longjmp
-Funktion erfolgt, setzt die Ausführung an der bestimmten Aufrufstelle fort, die die
jmp_buf
-Variable erstellt hat, die an
longjmp
übergeben wurde. In diesem Fall gibt
setjmp
den Wert zurück, der an
longjmp
übergeben wurde.
Der Aufruf von
setjmp
darf nur in einem der folgenden Kontexte erscheinen:
-
Der gesamte kontrollierende Ausdruck von
if
,
switch
,
while
,
do-while
,
for
.
switch(setjmp(env)) { // ...
-
Ein Operand eines relationalen oder Gleichheitsoperators, wobei der andere Operand ein ganzzahliger konstanter Ausdruck ist und der resultierende Ausdruck der gesamte kontrollierende Ausdruck von
if
,
switch
,
while
,
do-while
,
for
ist.
if(setjmp(env) > 10) { // ...
-
Der Operand eines unären !-Operators, wobei der resultierende Ausdruck der gesamte kontrollierende Ausdruck von
if
,
switch
,
while
,
do-while
,
for
ist.
while(!setjmp(env)) { // ...
-
Der gesamte Ausdruck eines
Ausdrucksstatements
(möglicherweise gecastet zu
void).setjmp(env);
Wenn
setjmp
in einem anderen Kontext erscheint, ist das Verhalten undefiniert.
Bei Rückkehr in den Gültigkeitsbereich von
setjmp
:
- alle zugänglichen Objekte, Gleitkomma-Statusflags und andere Komponenten der abstrakten Maschine haben dieselben Werte wie zu dem Zeitpunkt, als longjmp ausgeführt wurde,
-
mit Ausnahme der nicht-
volatile
lokalen Variablen in der Funktion, die den Aufruf von
setjmpenthält, deren Werte undefiniert sind, falls sie seit demsetjmp-Aufruf verändert wurden.
Inhaltsverzeichnis |
Parameter
| env | - | Variable zum Speichern des Ausführungszustands des Programms. |
Rückgabewert
0
wenn das Makro durch den ursprünglichen Code aufgerufen wurde und der Ausführungskontext in
env
gespeichert wurde.
Ein Wert ungleich Null, wenn gerade ein Non-local Jump durchgeführt wurde. Der Rückgabewert ist derselbe wie an longjmp übergeben.
Hinweise
Die oben genannten Anforderungen verbieten die Verwendung des Rückgabewerts von
setjmp
im Datenfluss (z.B. um ein Objekt damit zu initialisieren oder zuzuweisen). Der Rückgabewert darf nur entweder in der Kontrollflusssteuerung verwendet oder verworfen werden.
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.1.1 Die setjmp-Makro (S: 191)
- C11-Standard (ISO/IEC 9899:2011):
-
- 7.13.1.1 Das setjmp-Makro (S: 262-263)
- C99-Standard (ISO/IEC 9899:1999):
-
- 7.13.1.1 Die setjmp-Makro (S: 243-244)
- C89/C90 Standard (ISO/IEC 9899:1990):
-
- 4.6.1 Die setjmp-Makro
Siehe auch
|
springt zu angegebenem Ort
(Funktion) |
|
|
C++-Dokumentation
für
setjmp
|
|