来自Lua编程第3版第38页
练习4.5:你能解释为什么Lua有一个限制,即
goto不能跳出一个函数吗?(提示:你将如何实现该功能?)
我有几个猜测,为什么会这样:
a = f()但f goto在那行代码之后做了什么,那么它的价值是a多少?我想知道作者将如何回答这个问题.也许我会给他发电子邮件.
与此同时,还有其他人有什么想法吗?
小智 9
你的猜测暗示了答案.原因是因为goto语句及其目标必须位于同一堆栈帧中.在goto需要相同之前和之后的程序上下文,否则被跳转到的代码将不会在其正确的堆栈帧中运行,并且其行为将是未定义的. goto由于同样的原因,在C中具有相同的限制.
C标准库还提供了longjmp()和setjump()它做,可以实现的"GOTO"形式出当前堆栈帧的. setjmp()保存当前堆栈上下文.然后,您可以调用longjmp()将堆栈展开回您调用的位置setjmp().longjmp()在调用setjump()退出的函数后,您无法调用.