利用Duff's device在C/C++中模拟Python中的yield

发布时间:2019-07-03 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了利用Duff's device在C/C++中模拟Python中的yield脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

考虑一个简单的Python函数:

def gen():
    for i in range(10):
        yield i

是否有可能在C或者C++中实现呢?

Coroutines in C一文中详细的介绍了在c语言中实现的可能性。

现在简单介绍下:

版本1:

int gen(void) {
    static int i, state = 0;
    switch (state) {
        case 0: goto LABEL0;
        case 1: goto LABEL1;
    }
    LABEL0: /* start of function */
    for (i = 0; i < 10; i++) {
         state = 1; /* so we will come back to LABEL1 */
        return i;
        LABEL1:; /* resume control straight after the return */
    }
}

版本2:

int gen(void) {
    static int i, state = 0;
    switch (state) {
        case 0: /* start of function */
        for (i = 0; i < 10; i++) {
            state = 1; /* so we will come back to "case 1" */
            return i;
            case 1:; /* resume control straight after the return */
        }
    }
}

版本3:

#define crBegin static int state=0; switch(state) { case 0:
#define crReturn(i,x) do { state=i; return x; case i:; } while (0)
#define crFinish }
int gen(void) {
    static int i;
    crBegin;
    for (i = 0; i < 10; i++)
        crReturn(1, i);
    crFinish;
}

版本4:

#define crBegin static int state=0; switch(state) { case 0:
#define crReturn(x) do { state=__LINE__; return x; 
    case __LINE__:; } while (0)
#define crFinish }
int gen(void) {
    static int i;
    crBegin;
    for (i = 0; i < 10; i++)
        crReturn(i);
    crFinish;
}

对于C++,在boost库中,有专门的实现:
Boost.Coroutine
该库的部分实现使用了汇编语言

脚本宝典总结

以上是脚本宝典为你收集整理的利用Duff's device在C/C++中模拟Python中的yield全部内容,希望文章能够帮你解决利用Duff's device在C/C++中模拟Python中的yield所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。