1. 用switch-case和宏模拟协程的核心思路
在C/C++这类传统过程式语言中实现协程功能,最常见的替代方案就是利用switch-case配合宏定义来模拟协程的挂起和恢复机制。这种做法的本质是通过状态机管理执行流程,其核心原理可以拆解为:
- 状态保持:使用静态变量或结构体成员保存当前执行位置(通常是一个整型状态标识)
- 跳转控制:通过switch-case根据状态值跳转到对应的代码段
- 上下文模拟:用局部变量保存"协程"内部状态,通过宏隐藏状态管理细节
这种实现方式最早由Simon Tatham在《Coroutines in C》一文中提出,其经典实现如下:
c复制#define crBegin static int _cr_state = 0; switch(_cr_state) { case 0:
#define crReturn(x) do { _cr_state = __LINE__; return x; case __LINE__:; } while (0)
#define crFinish }
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 完整实现方案与宏定义技巧
2.1 基础宏定义实现
一个完整的协程模拟系统需要以下几组关键宏:
c复制// 协程声明宏
#define COROUTINE_DECLARE(name) \
struct name##_coroutine { \
int _cr_state; \
int _cr_result; \
// 协程开始宏
#define COROUTINE_BEGIN(name) \
name##_coroutine _cr_local; \
switch (_cr_local._cr_state) { \
case 0:
// 协程挂起宏
#define COROUTINE_YIELD(value) \
do { \
_cr_local._cr_state = __LINE__; \
_cr_local._cr_result = (value); \
return _cr_local._cr_resu
