0%

yield semantics in C/C++

其他語言已經有yield的語意了,不過C/C++必須手動模擬。
看了Coroutines in C之後,做了一下實驗。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int func()
{
static int i, state = 0;
switch (state)
{
case 0: goto LABEL0;
case 1: goto LABEL1;
}
LABEL0:
for (i = 0; i < 10; i++) {
state = 1;
return i;
LABEL1:;
}
return -1;
}

測試VC12、GCC和Clang之後,發現GCC要使用C99模式編譯才會成功。
不過美增加一個狀態就得增加一個LABEL,也是蠻麻煩的一件事,後來看到一個作法更好,之前從沒想過能這樣用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
int func()
{
static int i, state = 0;
switch (state)
{
case 0:
for (i = 0; i < 10; i++) {
state = 1;
return i;
case 1:;
}
}
return -1;
}

從沒想過switch/case的statement可以這樣用,開了眼界了。