The C语言参考手册,附录B描述了两个函数setjmp
and longjmp
对于所谓的东西非局部跳转。除了基本的了解之外setjmp
保存状态信息,longjmp 恢复state
,我一直无法理解此功能的确切流程和用例。
那么,这个功能到底有什么作用,又有什么用处呢?
至于控制流程:setjmp
返回两次,并且longjmp
永远不会回来。你打电话时setjmp
第一次,要存储环境,它返回零,当你调用时longjmp
,控制流从setjmp
与参数中提供的值。
(注意setjmp
实际上不一定是函数;它很可能是一个宏。longjmp
但它是一个函数。)
用例通常被引用为“错误处理”和“不要使用这些函数”。
这是一个小控制流示例:
jmp_buf env;
void foo()
{
longjmp(&env, 10); +---->----+
} | |
| |
int main() (entry)---+ ^ V
{ | | |
if(setjmp(&env) == 0) | (= 0) | | (= 10)
{ | ^ |
foo(); +---->----+ |
} +---->----+
else |
{ |
return 0; +--- (end)
}
}
Notes:
您不能将 0 传递给longjmp
。如果你这样做,1
由返回setjmp
.
您不得从调用的函数返回setjmp
在相应的之前longjmp
。换句话说,longjmp
只能被调用above setjmp
在调用堆栈中。
-
(感谢@wildplasser:)你实际上不能store的结果setjmp
。如果您想以多种不同的方式返回,您可以使用switch
, 尽管:
switch (setjmp(&env))
{
case 0: // first call
case 2: // returned from longjmp(&env, 2)
case 5: // returned from longjmp(&env, 5)
// etc.
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)