capypad
0 Tage Serie
c / expert
Snippet

Nicht-lokale Sprünge mit setjmp und longjmp

setjmp und longjmp bieten eine Möglichkeit, nicht-lokale Sprünge durchzuführen und dabei den normalen Funktionsrückgabemechanismus zu umgehen. setjmp speichert die Ausführungsumgebung (Stackpointer, Programmzähler), und longjmp stellt sie wieder her, was im Wesentlichen ein 'Try-Catch'-Verhalten in C ermöglicht. Beachten Sie, dass lokale Variablen in der aufrufenden Funktion unbestimmte Werte haben könnten, wenn sie zwischen setjmp und longjmp geändert wurden.

snippet.c
c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <setjmp.h>
jmp_buf env;
 
void deep_nesting() {
if (error_occurred) longjmp(env, 1);
}
 
int main() {
if (setjmp(env) == 0) {
// Normal execution path
deep_nesting();
} else {
// Exception handling path
printf("Recovered from deep error\n");
}
return 0;
}
Erklärung
1
jmp_buf env;
Ein Puffer zum Speichern des Prozessorstatus und der Umgebungsinformationen.
2
if (setjmp(env) == 0)
Der initiale Aufruf gibt 0 zurück. Bei einer Rückkehr via longjmp wird der an longjmp übergebene Wert zurückgegeben.
3
longjmp(env, 1);
Stellt die in 'env' gespeicherte Umgebung wieder her, was dazu führt, dass setjmp 1 zurückgibt.