函数
<csetjmp>

longjmp

void longjmp (jmp_buf env, int val);
长跳转
将环境恢复到由 env 指示的状态,使填充 envsetjmp 表达式的求值结果为 val

该函数永远不会返回到其被调用的位置。相反,函数会将控制权转移到上次使用 setjmp 填充 env 的位置,并将整个表达式的求值结果设为 val(除非 val 为零,此时求值结果为 1)。

如果 env 不是由先前对 setjmp 的调用所填充,或者包含该调用的函数已经终止执行,则会导致未定义行为

在 C++ 中,实现可能会执行栈展开,这会销毁具有自动生命周期的对象。如果这调用了任何非平凡析构函数,则会导致未定义行为

参数

env
由先前对 setjmp 的调用填充的 jmp_buf 类型的对象,包含将环境恢复到该点所需的信息。
val
setjmp 表达式的求值结果。
如果该值为零,则表达式的求值结果为 1

返回值

无(该函数永不返回)。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/* 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;
}

输出
val is 0
val is 1


数据竞争

setjmplongjmp 对的作用域仅限于当前线程。

异常 (C++)

如果在潜在的栈展开中不涉及任何具有非平凡析构函数的自动对象,则此函数永远不会抛出异常(no-throw 保证)。
否则,将导致未定义行为

另见