我正在阅读boost/asio/coroutine.hpp
并且无法理解BOOST_ASIO_CORO_REENTER和BOOST_ASIO_CORO_YIELD的实现。的扩展形式为
reenter (this) {
yield ..
yield ..
}
似乎是交织在一起的 switch/if/for 语句。我想知道为什么这是有效的 C 代码?我写了类似的东西(如下所示)并发现它使用 gcc 进行编译。
int main() {
int a = 1;
switch (a)
case 0: if (1) a = 2;
else case 1: for (;;) {
case 3:
break;
}
return 0;
}
原因是因为switch 语句不是结构化的控制流语句。相反,它们应该被视为静态调度的语法糖。调度意味着控制流被重定向,静态意味着编译器知道它被重定向到哪里。
所以你的代码
int a = 1;
switch (a)
case 0: if (1) a = 2;
else case 1: for (;;) {
case 3:
break;
}
return 0;
会被编译成大致相当于
int a = 1;
void *dest = dispatch(a, { case0_addr, case1_addr, case3_addr });
goto *dest;
case0_addr:
if (1) {
a = 2;
} else {
case1_addr:
for (;;) {
case3_addr:
goto case_end;
}
}
case_end:
return 0;
where dispatch
是编译器运行的函数,用于发出静态调度所需的机器代码。由于所有调度值都是常量,并且编译器已知所有调度目标,因此它可以生成非常高效的机器代码。
至于为什么它是合法的,我想是因为没有特别的理由说它是非法的。如图所示,case
语句只是 goto 标签,因此可以将它们放在任何地方。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)