c / expert
Snippet
Emulation von Ausnahmenbehandlung mittels Nicht-Lokalen Sprüngen mit setjmp und longjmp
Nicht-lokale Sprünge über setjmp und longjmp ermöglichen es dem Steuerfluss, standardmäßige Funktions-Rückgabe-Stack-Frames zu umgehen. Der Aufruf von setjmp speichert den Ausführungskontext, während longjmp den gespeicherten Kontext wiederherstellt, was einen Ausnahmemedium-Mechanismus in reinem C erzeugt.
snippet.c
c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>#include <setjmp.h>static jmp_buf exception_buffer;void process_data(int value) {if (value < 0) {longjmp(exception_buffer, 101);}}int main(void) {int error_code = setjmp(exception_buffer);if (error_code == 0) {process_data(-5);} else {printf("Caught exception code: %d\n", error_code);}return 0;}
Erklärung
1
static jmp_buf exception_buffer;
Deklariert einen Ausführungskontext-Puffer zur Speicherung von CPU-Registerzuständen.
2
longjmp(exception_buffer, 101);
Stellt in jmp_buf gespeicherte CPU-Register wieder her und springt mit Code 101 zur setjmp-Stelle zurück.
3
int error_code = setjmp(exception_buffer);
Speichert den aktuellen Ausführungskontext; gibt initial 0 zurück und bei longjmp-Wiederherstellung einen Wert ungleich 0.