为什么Lua中的goto不能跳出函数?

练习 4.5:你能解释为什么 Lua 有一个限制,即“goto”不能跳出一个函数吗?(提示:你将如何实现这个功能?)

我有几个猜测:

  • 如果你从一个函数跳到另一个函数,而第二个函数返回,那么 PC(程序计数器)去哪儿了?
  • 如果你有 a = f(),但是 f 在该行代码之后执行了 goto,那么 a 的值是什么?
  • 是否不可能因为不同平台的调用惯例而定义一个标准行为?

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

与此同时,还有其他人有一些想法吗?

点赞
用户1821164
用户1821164

你的猜测提示了答案。原因是 goto 语句及其目标必须驻留在同一个堆栈帧中。在 goto 之前和之后的程序上下文必须相同,否则跳转到的代码将无法在其正确的堆栈帧中运行,其行为将是未定义的。出于同样的原因,C中的 goto 也有相同的限制。

C标准库还提供了 longjmp()setjmp(),它们允许你实现一种形式的跳转,跳出当前的堆栈帧。 setjmp()保存当前的堆栈上下文。然后,您可以调用 longjmp() 以解开堆栈,回到调用 setjmp() 的地方。在调用 setjmp() 的函数退出之后,不能调用 longjmp()

2013-09-05 21:50:08