为什么在 C/C++ 中交织 switch/for/if 语句是有效的? [复制]

2023-12-10

我正在阅读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(使用前将#替换为@)

为什么在 C/C++ 中交织 switch/for/if 语句是有效的? [复制] 的相关文章

随机推荐