关于c实现yield功能,这个网站有介绍的
http://coolshell.cn/articles/10975.html
#include <stdio.h>
#define Begin() static int state=0; switch(state) { case 0:
#define Yield(x) do { state=__LINE__; return x; case __LINE__:; } while (0)
#define End() }
int function(void) {
static int i;
Begin();
for (i = 0; i < 10; i++)
Yield(i);
End();
}
int main(){
int j;
for(j = 0; j < 20; j++){
printf("%d | ", function());
}
printf ("\n");
return 0;
}
1
jiang42 2015-08-02 11:23:59 +08:00 2
应该是使用了undefined的行为,gcc和clang定义的不一致
把function里面的循环改成 0 ~ 20 gcc和clang行为就一致了 |
2
canautumn 2015-08-02 11:30:56 +08:00 3
function里for循环一共就执行十次,但是你调用了20次,后十次是未定义行为,返回的是垃圾值,因为你后十次没有返回值。在End();前加一行 return 0;再看看。
|
4
lalalakakaka 2015-08-02 13:50:18 +08:00 1
就问一件事,你们觉得coolshell这篇文章写的怎么样?
我是看的云里雾里的,还没官方文档写的清楚 |
5
lalalakakaka 2015-08-02 14:02:40 +08:00
补充一个 VS2010 下的结果:
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 10 | 10 | 10 | 10 | 10 | 10 | 10 | 10 | 10 | |
6
lukertty OP @lalalakakaka 同看不懂,诶
|
7
noli 2015-08-02 16:22:03 +08:00 1
用 boost context 来实现 yield 简单又好用……
http://www.boost.org/doc/libs/1_58_0/libs/context/doc/html/context/context.html |
8
jiang42 2015-08-02 16:35:41 +08:00
@lukertty
@lalalakakaka 可以看的出来两位真的没看懂。。。看懂了就会知道这里面有未定义行为。。。 其实我觉得教程这种东西,对上了脑电波就成,有些人喜欢这种风格,有些人喜欢那种风格。。。 |
9
alphonsez 2015-08-02 16:47:34 +08:00
太山寨了,直接搞个全局变量……
|