【赤石C++】使用宏魔法在 C 语言中实现协程
协程
协程(Coroutine) 可以看作是“可暂停和恢复的函数”。与普通函数只能“调用-返回”一次不同,协程可以在执行过程中多次暂停(yield)并交出控制权,之后又能从上次暂停的地方继续执行
比如:
1 | |
每次调用next(),协程就从上次yield的地方继续执行
C 语言实现协程
赤过“达夫设备”这篇文章的都知道,switch 语句的 case 标签可以出现在 switch 内部任意位置,甚至嵌套在另一个循环里
<此处插入公众号超链接>
1 | |
(如果你使用 MSVC,这段代码可能需要 Release 模式才能编译)

乍一看有点魔法,我们不妨先手动将宏展开再进行分析
1 | |

执行流程:
首次调用时
- 初始时
state = 0,switch进入case 0分支 case 0后面跟的是一条空语句(一个分号),所以fall-through到for循环起始处
1 | |
do { ... } while(0)不需要特别分析,这个是常用的编程技巧,本文不会涉及- 进入
for循环后,将state设置为23,并返回初始i = 0
再次调用时
- 由于
state = 23,switch语句进入case 23分支 - 同样的,
case 23后面跟的也是一条空语句,所以fall-through到for循环末尾,并进行条件判断 - 条件判断成立时,
for循环跳转到开头再次执行,由于i是静态变量,保存了上一次调用的状态,所以返回i = 1
参考
https://www.chiark.greenend.org.uk/~sgtatham/coroutines.html (顺带一提,这位大神还是 PuTTY 的开发者)
【赤石C++】使用宏魔法在 C 语言中实现协程
https://crackme.net/articles/coroutine/