C++ Reference: Standard C++ Library reference: C Library: csetjmp: longjmp

发布于:2022-10-14 ⋅ 阅读:(467) ⋅ 点赞:(0)

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) (保存恢复调用环境信息的类型(类型))


网站公告

今日签到

点亮在社区的每一天
去签到