C-Bibliotheksfunktion -longjmp()

C-Standardbibliothek - <setjmp.h>

Beschreibung

C-Bibliotheksfunktionenvoid longjmp(jmp_buf environment, int value)Stellt die durch den letzten Aufrufsetjmp()gespeicherte Umgebung auf die Umgebung wieder her, die beim Aufruf des Makros gespeichert wurde,jmp_bufDie Parametereinstellung wird durch einen vorherigen Aufruf von setjmp() erzeugt.

longjmp()ist die C-Standardbibliothek<setjmp.h>eine Funktion, die für nichtlokale Sprünge verwendet wird. Sie ermöglicht es dem Programm, zwischen mehreren Frames auf dem Stack zu springen, und wird typischerweise für Fehlerbehandlung oder Ausnahmebehandlung sowie für Kontrollflussänderungen in bestimmten speziellen Situationen verwendet.

Deklaration

Das Folgende ist die Deklaration der Funktion longjmp().

#include <setjmp.h>

void longjmp(jmp_buf env, int val);

Parameter

  • env: einsjmp_bufeine Variable vom Typ, die speichertsetjmp()Rückgabeinformation.
  • val: ein Integer-Wert, wiesetjmp()der Rückgabewert von.

Rückgabewert

Die Funktion longjmp() selbst hat keinen Rückgabewert, aber sie überträgt den Programmsteuerfluss an die Stelle, an der setjmp() zuvor aufgerufen wurde, und macht val zum Rückgabewert von setjmp().

Beispiel

Das folgende Beispiel demonstriert die Verwendung der Funktion longjmp().

Beispiel

#include <stdio.h>
#include <setjmp.h>

static jmp_buf buf;

void second(void) {
    printf("second\n");         // Ausgeben
    longjmp(buf,1);             // Zurück zur setjmp-Aufrufstelle springen - setjmp 1 zurückgeben lassen
}

void first(void) {
    second();
    printf("first\n");          // Es ist unmöglich, diese Zeile auszuführen.
}

int main() {  
    if ( ! setjmp(buf) ) {
        first();                // Bevor diese Zeile ausgeführt wird, gibt setjmp 0 zurück
    } else {                    // Wenn longjmp zurückspringt, gibt setjmp 1 zurück, also wird diese Zeile ausgeführt.
        printf("main\n");       // Ausgeben
    }

    return 0;
}

Lassen Sie uns das obige Programm kompilieren und ausführen, was das folgende Ergebnis erzeugt:

second
main

Hinweise

  • Nutzunglongjmp()undsetjmp()Sie müssen mit Vorsicht verwendet werden, da sie Code schwer verständlich und schwer zu debuggen machen können, besonders in großen Programmen.
  • longjmp()Sie können die übliche Ressourcenbereinigung und Destruktoraufrufe umgehen, was zu Ressourcenlecks und undefiniertem Verhalten führen kann.
  • In Umgebungen mit Multithreading oder Signal-Handlern sollten sie vermieden werden.longjmp()undsetjmp()。

Anwendungsfall

  • Fehlerbehandlung und Ausnahmebehandlung:longjmp()undsetjmp()Sie können verwendet werden, um einfache Mechanismen zur Fehler- und Ausnahmebehandlung zu implementieren.
  • Zustandsautomaten: Bei Zustandsübergängen in einem Zustandsautomaten ist es manchmal notwendig, zwischen verschiedenen Zuständen zu springen.longjmp()undsetjmp()kann verwendet werden, um diese Art von Zustandsübergang zu implementieren.
  • Zusammen mit Signalbehandlung verwendet: In einigen speziellen Fällen,longjmp()undsetjmp()können sie verwendet werden, um aus Signalhandlern herauszuspringen.

Zusammenfassung

longjmp()undsetjmp()Sie bieten einen sehr flexiblen Mechanismus, um zwischen verschiedenen Teilen eines Programms zu springen, aber sie müssen mit großer Sorgfalt verwendet werden, um potenzielle Probleme und undefiniertes Verhalten zu vermeiden. Sie werden typischerweise zur Fehlerbehandlung und Ausnahmebehandlung sowie für Änderungen des Kontrollflusses in bestimmten spezifischen Situationen verwendet.

C-Standardbibliothek - <setjmp.h>

Weitere Erweiterungen