Namespaces
Variants

longjmp

From cppreference.net
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 setjmp aufgerufen hat, von einem anderen Thread ausgeführt wurde) ist ebenfalls undefiniertes Verhalten.

(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 longjmp zu diesem setjmp zu undefiniertem Verhalten, selbst wenn die Kontrolle innerhalb der Funktion verblieb.

Beim Zurückspringen im Stack gibt longjmp keine VLAs frei. Speicherlecks können auftreten, wenn ihre Lebensdauern auf diese Weise beendet werden:

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