码迷,mamicode.com
首页 > 其他好文 > 详细

一段很精妙的类协程代码

时间:2015-05-24 01:19:31      阅读:129      评论:0      收藏:0      [点我收藏+]

标签:

#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__宏也用的比较赞。

一段很精妙的类协程代码

标签:

原文地址:http://www.cnblogs.com/lhonglwl/p/4525211.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!