c / expert
Snippet
Fortsetzbare Funktions-Coroutinen mittels verschachtelter Switch-Case-Anweisungen
Durch Nutzung der C-Standard-Grammatikregel, nach der Case-Labels in verschachtelte Schleifenblöcke springen können (angelehnt an Duff's Device), können Leichtgewicht-Coroutinen die Ausführung unterbrechen und an exakt der vorherigen Stelle fortsetzen.
snippet.c
c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <stdio.h>typedef struct {int state;int i;} GeneratorState;int step_generator(GeneratorState *ctx) {switch (ctx->state) {case 0:for (ctx->i = 0; ctx->i < 3; ctx->i++) {ctx->state = 1;return ctx->i * 10;case 1:;}}ctx->state = -1;return -1;}int main(void) {GeneratorState gen = { .state = 0, .i = 0 };int val;while ((val = step_generator(&gen)) != -1) {printf("Yielded: %d\n", val);}return 0;}
Erklärung
1
switch (ctx->state)
Springt beim erneuten Aufruf direkt zur gespeicherten Ausführungsmarkierung im Generator-Kontext.
2
case 1:;
Dient als internes Sprungziel innerhalb des Schleifenkörpers und umgeht beim Fortsetzen die Reinitialisierung.