C++官网参考链接:https://cplusplus.com/reference/csetjmp/longjmp/
函数
<csetjmp>
longjmp
void longjmp (jmp_buf env, int val);
长距离跳转
将环境恢复到env所指示的状态,并将填充env的setjmp表达式计算为val。
函数永远不会返回到被调用的位置。相反,该函数将控制转移到最后一次使用setjmp填充env的位置,并将整个表达式计算为val(除非该值为0,在这种情况下,它的计算值为1)。
如果之前对setjmp的调用没有填充env,或者带有这种调用的函数已终止执行,则会导致未定义的行为。
在C++中,实现可以执行堆栈展开,销毁具有自动持续时间的对象。如果调用任何非平凡析构函数(non-trivial destructors),则会导致未定义的行为。
参数
env
类型为jmp_buf的对象,该对象由之前对setjmp的调用填充,该调用包含将环境恢复到该点的信息。
val
setjmp表达式计算的值。
如果这是0,表达式的计算结果为1。
返回值
没有返回值。
用例
/* longjmp example */
#include <stdio.h> /* printf */
#include <setjmp.h> /* jmp_buf, setjmp, longjmp */
main()
{
jmp_buf env;
int val;
val=setjmp(env);
printf ("val is %d\n",val);
if (!val) longjmp(env, 1);
return 0;
}
输出:
数据竞争
setjmp和longjmp对的作用域仅限于当前线程。
异常(C++)
如果潜在的堆栈展开中没有涉及具有非平凡析构函数(non-trivial destructors)的自动对象,则此函数永远不会抛出异常(无抛出保证)。
否则,它将导致未定义的行为。
另请参考
setjmp Save calling environment for long jump (macro) (保存长距离跳转的调用环境(宏))
jmp_buf Type to hold information to restore calling environment (type) (保存恢复调用环境信息的类型(类型))