gpt4 book ai didi

c - 在 C 中实现 yield

转载 作者:太空狗 更新时间:2023-10-29 16:52:43 25 4
gpt4 key购买 nike

例如:

int getNext(int n) {
while (TRUE) {
n = n+1;
yield n;
}
}

int main() {
while (TRUE) {
int n = getNext(1);
if (n > 42)
break;
printf("%d\n",n);
}
}

这样上面的代码将打印从 1 到 42 的所有数字。我想到让 yield 把 getNext 的地址改成 yield 之后的指令。但我无法弄清楚如何保存上下文(寄存器/变量),因为调用函数会遍历堆栈。

注意:

我意识到上面的代码可以很容易地通过静态变量实现,但这不是重点。

最佳答案

您可以这样做,即使是在可移植的 C 中也是如此。这是一个可行的粗略示例 (gcc -Wall gen.c):

#include <stdbool.h>
#include <stdio.h>
#include <setjmp.h>

#define YIELD(func, n) if (! setjmp(func##_gen_jmp)) { \
func##_ret = n; \
longjmp(func##_caller_jmp, 1); \
}


#define GENERATOR(ret, func, argt, argv) \
static jmp_buf func##_caller_jmp; \
static jmp_buf func##_gen_jmp; \
static bool func##_continue=false; \
static ret func##_ret; \
\
void func##__real(argt argv); \
\
ret func(argt argv) { \
if (!func##_continue) { \
func##_continue=true ; \
if (! setjmp(func##_caller_jmp)) { \
func##__real(argv); \
} else { \
return func##_ret; \
} \
} \
else { \
longjmp(func##_gen_jmp,1); \
} \
return 0; \
} \
void func##__real(argt argv)



GENERATOR(int, getNext, int, n) {
static int counter;

counter = n;
while (true) {
counter = counter+1;
YIELD(getNext, counter);
}
}

int main() {
while (true) {
int n = getNext(1);
if (n > 42)
break;
printf("%d\n",n);
}
return 0;
}

关于c - 在 C 中实现 yield,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17478264/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com