C-Bibliotheksmakro -setjmp()

C-Standardbibliothek - <setjmp.h>

setjmp()ist die C-Standardbibliothek<setjmp.h>Ein Makro, das den aktuellen Programmausführungszustand speichert, sodass zu einem späteren Zeitpunktlongjmp()zu diesem Zustand zurückgekehrt werden kann.

C-Bibliotheksmakroint setjmp(jmp_buf environment): Erstellt einen lokalen jmp_buf-Puffer und initialisiert ihn für zukünftige Rücksprünge zu diesem Punkt. Diese Unterroutine speichert die Aufrufumgebung des Programms im Puffer, auf den der Parameter env zeigt, und env wird von longjmp verwendet. Wenn sie von einem direkten Aufruf von setjmp zurückkehrt, gibt setjmp 0 zurück. Wenn sie von einer durch longjmp wiederhergestellten Programmaufrufumgebung zurückkehrt, gibt setjmp einen Wert ungleich null zurück.

Deklaration

Nachfolgend finden Sie die Deklaration des setjmp()-Makros.

#include <setjmp.h>

int setjmp(jmp_buf env);

Parameter

  • env: einsjmp_bufEine Variable dieses Typs, die verwendet wird, um den aktuellen Programmausführungszustand zu speichern.

Rückgabewert

  • ifsetjmp()Bei direktem Aufruf ist der Rückgabewert 0.
  • ifsetjmp()erfolgt durchlongjmp()Der Rückgabewert des Aufrufs ist derlongjmp()Wert ungleich null, gesetzt von

Beispiel

Das folgende Beispiel demonstriert die Verwendung des setjmp()-Makros.

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 gibt dann 1 zurück } void first(void) { second(); printf("first\n"); // Diese Zeile kann nicht ausgeführt werden. } int main() { if ( ! setjmp(buf) ) { first(); // Bevor diese Zeile erreicht 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

Anwendungsfall

  • Fehlerbehandlung und Ausnahmebehandlung:setjmp()undlongjmp()Es kann verwendet werden, um einfache Mechanismen zur Fehler- und Ausnahmebehandlung zu implementieren.
  • Zustandsmaschine: Bei Zustandsübergängen einer Zustandsmaschine ist es manchmal notwendig, zwischen verschiedenen Zuständen zu springen,setjmp()undlongjmp()kann verwendet werden, um diese Art von Zustandsübergang zu implementieren.
  • zusammen mit der Signalbehandlung verwendet: In einigen speziellen Fällen,setjmp()undlongjmp()Es kann verwendet werden, um aus einem Signal-Handler herauszuspringen.

Hinweise

  • Nutzungsetjmp()undlongjmp()Sie erfordern große Sorgfalt, da sie dazu führen können, dass der Kontrollfluss des Programms sehr chaotisch wird, was zu Code führt, der schwer zu verstehen und zu debuggen ist.
  • Vermeiden Sie ihre Verwendung in Umgebungen mit Multithreading oder Signal-Handlern,setjmp()undlongjmp()da sie zu undefiniertem Verhalten führen können.

Zusammenfassung

setjmp()undlongjmp()Sie bieten einen sehr flexiblen Mechanismus, um zwischen verschiedenen Teilen eines Programms zu springen. Obwohl sie in bestimmten speziellen Situationen sehr nützlich sind, um den Kontrollfluss zu ändern, müssen sie in der Praxis mit Vorsicht verwendet werden, um potenzielle Probleme und undefiniertes Verhalten zu vermeiden.

C-Standardbibliothek - <setjmp.h>

Weitere Erweiterungen