Namespaces
Variants

longjmp

Von de.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 gespeichert durch einen vorherigen Aufruf von setjmp. Diese Funktion kehrt nicht zurück. Die Kontrolle wird an die Aufrufstelle des Makros setjmp übergeben, 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 (entweder durch Rückkehr oder durch ein anderes longjmp weiter oben im Stack), ist das Verhalten undefiniert. Mit anderen Worten, es sind nur Longjumps nach oben im Aufrufstack erlaubt.

Springe über Threads hinweg (wenn die Funktion, die setjmp aufgerufen wurde, von einem anderen Thread ausgeführt wurde) ist ebenfalls undefiniertes Verhalten.

(seit 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 Gültigkeitsbereich verlassen hat, führt longjmp zu diesem setjmp zu undefiniertem Verhalten, selbst wenn die Kontrolle innerhalb der Funktion verblieb.

Auf dem Weg nach oben im Stack deallokiert longjmp keine VLAs, Speicherlecks können auftreten, wenn ihre Lebensdauer auf diese Weise beendet wird:

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
}
(seit C99)

Parameter

env - Variable, die sich auf den Ausführungszustand des Programms bezieht, der durch setjmp
status - der Wert, der von setjmp zurückgegeben werden soll. Wenn er gleich 0 ist, wird stattdessen 1 verwendet

Anmerkungen

longjmp ist für die Behandlung unerwarteter Fehlerzustände gedacht, bei denen die Funktion nicht sinnvoll zurückkehren kann. Dies ähnelt der Ausnahmebehandlung in anderen Programmiersprachen.

Beispiel

#include <setjmp.h>
#include <stdio.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

  • C23 Standard (ISO/IEC 9899:2024):
  • 7.13.2.1 Das longjmp-Makro (S. 283-284)
  • C17 Standard (ISO/IEC 9899:2018):
  • 7.13.2.1 Das longjmp-Makro (S. 191-192)
  • C11 Standard (ISO/IEC 9899:2011):
  • 7.13.2.1 Das longjmp-Makro (S. 263-264)
  • C99 Standard (ISO/IEC 9899:1999):
  • 7.13.2.1 Das 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