Namespaces
Variants

setjmp

From cppreference.net
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:

  1. Der gesamte kontrollierende Ausdruck von if , switch , while , do-while , for .
    switch(setjmp(env)) { // ...
  2. 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) { // ...
  3. 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)) { // ...
  4. 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 setjmp enthält, deren Werte undefiniert sind, falls sie seit dem setjmp -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)