6

来自《Lua 编程》书第 3 版第 38 页

练习 4.5:你能解释一下为什么 Lua 有 agoto不能跳出函数的限制吗?(提示:您将如何实现该功能?)

关于为什么会这样,我有一些猜测:

  • 如果你从一个函数跳到另一个函数然后第二个函数返回,PC 去哪儿了?
  • 如果你有a = f()但是 fgoto在那行代码之后做了一个 to ,那么 的值是a多少?
  • 由于不同平台的调用约定,无法定义标准行为吗?

我想知道作者将如何回答这个问题。也许我会给他发电子邮件。

与此同时,还有其他人有什么想法吗?

4

1 回答 1

10

你的猜测暗示了答案。原因是goto语句和它的目的地必须驻留在同一个堆栈帧中。之前和之后的程序上下文goto需要相同,否则跳转到的代码将不会在其正确的堆栈帧中运行,并且其行为将是未定义的。 goto由于相同的原因,在 C 中具有相同的限制。

C 标准库还提供longjmp()并且setjump()允许您从当前堆栈框架中实现一种“goto”形式。 setjmp()保存当前堆栈上下文。然后,您可以调用longjmp()将堆栈展开回您调用的位置setjmp()。您不能在调用longjmp()的函数setjump()退出后调用。

于 2013-09-05T21:50:08.633 回答