#include <stdio.h> typedef struct { int i; int num; int state; } task; #define crBegin(state) switch (state) { case 0: #define crReturn(state, ret) \ (state) = __LINE__; return (ret); case __LINE__: #define crEnd() \ } int cb(task *t) { crBegin(t->state); for (;;) { t->num = 1; for (t->i = 0; t->i < 20; t->i++) { crReturn(t->state, t->num); t->num += 1; } } crEnd(); return 0; } int main() { task t; int i; t.state = 0; for (i = 0; i < 100; i++) { printf("%d ", cb(&t)); } return 0; }
===================================
代码利用了C语言中switch的case标签可以在其他case代码块中的小技巧。达到了可以重入函数时继续上次执行的功能(协程的主要特点)。
其次为了标签的自动化和不重复性,__LINE__宏也用的比较赞。
时间: 2024-10-10 18:09:06