
关于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 应该是使用了undefined的行为,gcc和clang定义的不一致 把function里面的循环改成 0 ~ 20 gcc和clang行为就一致了 |
2 canautumn 2015-08-02 11:30:56 +08:00 function里for循环一共就执行十次,但是你调用了20次,后十次是未定义行为,返回的是垃圾值,因为你后十次没有返回值。在End();前加一行 return 0;再看看。 |
4 lalalakakaka 2015-08-02 13:50:18 +08:00 就问一件事,你们觉得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 用 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 太山寨了,直接搞个全局变量…… |