setjmp
| Definiert im Header <setjmp.h> |
||
| #define setjmp(env) /* implementierungsabhängig */ |
||
Speichert den aktuellen Ausführungskontext in einer Variablen env vom Typ jmp_buf. Diese Variable kann später von der Funktion longjmp verwendet werden, um den aktuellen Ausführungskontext wiederherzustellen. Das heißt, wenn ein Aufruf der Funktion longjmp erfolgt, wird die Ausführung an der Stelle fortgesetzt, an der die jmp_buf Variable, die an longjmp übergeben wurde, konstruiert 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 erfolgen
- Der gesamte Kontrollausdruck von if, switch, while, do-while, for.
switch(setjmp(env)) { // ...
- Ein Operand eines relationalen oder Gleichheitsoperators, dessen anderer Operand ein ganzzahliger konstanter Ausdruck ist, wobei der resultierende Ausdruck der gesamte Kontrollausdruck von if, switch, while, do-while, for ist.
if(setjmp(env) > 10) { // ...
- Der Operand eines unären !-Operators, wobei der resultierende Ausdruck der gesamte Kontrollausdruck von if, switch, while, do-while, for ist.
while(!setjmp(env)) { // ...
- Der gesamte Ausdruck einer Ausdrucksanweisung (möglicherweise nach
voidgecastet).setjmp(env);
Wenn setjmp in einem anderen Kontext erscheint, ist das Verhalten undefiniert.
Bei der Rückkehr in den Geltungsbereich von setjmp
- haben alle zugänglichen Objekte, Gleitkomma-Statusflags und andere Komponenten der abstrakten Maschine die gleichen Werte wie zum Zeitpunkt der Ausführung von longjmp,
- mit Ausnahme der nicht-volatile-lokalen Variablen in der Funktion, die den Aufruf von
setjmpenthält, deren Werte unbestimmt sind, wenn sie seit dem Aufruf vonsetjmpgeändert wurden.
Inhalt |
[bearbeiten] Parameter
| env | - | variable, um den Ausführungszustand des Programms zu speichern. |
[bearbeiten] Rückgabewert
0, wenn das Makro vom ursprünglichen Code aufgerufen wurde und der Ausführungskontext in env gespeichert wurde.
Ein von Null verschiedener Wert, wenn gerade ein nicht-lokaler Sprung durchgeführt wurde. Der Rückgabewert ist derselbe wie an longjmp übergeben.
[bearbeiten] Anmerkungen
Die obigen Anforderungen verbieten die Verwendung des Rückgabewerts von setjmp im Datenfluss (z. B. zur Initialisierung oder Zuweisung eines Objekts damit). Der Rückgabewert kann nur entweder im Kontrollfluss verwendet oder verworfen werden.
[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.1.1 Das 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 Das setjmp-Makro (S. 243-244)
- C89/C90-Standard (ISO/IEC 9899:1990)
- 4.6.1 Das setjmp-Makro
[bearbeiten] Siehe auch
| springt zur angegebenen Position (Funktion) | |
| C++-Dokumentation für setjmp
| |