c / expert
Snippet
Non-lokale Ausnahme-Emulation mit setjmp, longjmp und Volatile-Speicherung
Die Funktionen setjmp und longjmp ermöglichen non-lokale Sprünge über mehrere Stack-Frames hinweg. Lokale, nicht-statische Variablen, die zwischen setjmp und longjmp geändert werden, müssen volatile sein, damit ihr Wert beim Stack-Unwinding erhalten bleibt.
snippet.c
c
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>#include <setjmp.h>static jmp_buf env;void error_recovery(void) {volatile int status_code = 404;if (setjmp(env) == 0) {longjmp(env, 1);} else {printf("Recovered error code: %d\n", status_code);}}
Erklärung
1
static jmp_buf env;
Definiert einen Registerumgebungs-Puffer zum Speichern des Kontextzustands.
2
volatile int status_code = 404;
Deklariert eine Variable als volatile, um eine Zerstörung des Werts bei longjmp zu verhindern.
3
if (setjmp(env) == 0)
Speichert Ausführungskontext; gibt 0 beim Aufruf und einen Wert != 0 nach longjmp zurück.
4
longjmp(env, 1);
Stellt gespeicherte Stack-Umgebung wieder her und springt zurück zum setjmp-Auswertungspunkt.