capypad
0 Tage Serie
c / expert
Snippet

Dispatch-Tabellen mit Funktionszeigern

Anstatt große Switch-Case-Blöcke für Zustandsautomaten oder Befehlsdekodierung zu verwenden, nutzt Experten-C-Code Dispatch-Tabellen. Dies sind Arrays von Funktionszeigern, die über ein Enum oder einen Opcode indiziert werden. Dieses Muster verbessert die Branch Prediction, reduziert die zyklomatische Komplexität und macht den Code erweiterbar (O(1) Suche vs. O(n) Verzweigung).

snippet.c
c
1
2
3
4
5
6
7
8
9
10
11
typedef void (*handler_t)(int);
 
void handle_init(int v) { /* ... */ }
void handle_stop(int v) { /* ... */ }
 
handler_t dispatch[] = {
[STATE_INIT] = handle_init,
[STATE_STOP] = handle_stop
};
 
// Usage: dispatch[current_state](payload);
Erklärung
1
typedef void (*handler_t)(int);
Definiert einen Typ für einen Zeiger auf eine Funktion, die ein int nimmt und void zurückgibt.
2
[STATE_INIT] = handle_init
Verwendet C99 Designated Initializers, um Enums spezifischen Funktionsadressen zuzuweisen.