<csetjmp>

setjmp

int setjmp (jmp_buf env);
保存调用环境以进行长跳转
此宏以函数形式将当前代码执行点的调用环境信息填充到 env 中,以便后续通过调用 longjmp 来恢复。

使用存储在 env 中的信息调用 longjmp 会恢复相同的状态,并将控制权返回到该点(setjmp 的调用),该调用被评估为一个特定的非零值。

调用环境的状态包括所有可访问对象的数值,但不包括局部函数中自动持续时间的对象,除非它们具有 volatile 限定的类型并且在调用 longjmp 之前发生更改;这些对象的数值是未定义的。

setjmp 的调用应单独作为表达式语句,或者在选择语句或迭代语句中进行评估,作为(可能被否定的)整个控制表达式,或者与整型常量表达式进行比较。否则,将导致未定义行为

参数

env
用于存储环境信息的 jmp_buf 类型对象。

返回值

此宏可能返回多次:第一次是直接调用时;在这种情况下,它始终返回零。
当使用设置到 env 的信息调用 longjmp 时,宏会再次返回;这次它返回传递给 longjmp 的第二个参数的值(如果该值不为零),或者如果为零则返回 1

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/* setjmp example: error handling */
#include <stdio.h>      /* printf, scanf */
#include <stdlib.h>     /* exit */
#include <setjmp.h>     /* jmp_buf, setjmp, longjmp */

main()
{
  jmp_buf env;
  int val;

  val = setjmp (env);
  if (val) {
    fprintf (stderr,"Error %d happened",val);
    exit (val);
  }

  /* code here */

  longjmp (env,101);   /* signaling an error */

  return 0;
}

该函数使用 setjmp 设置一个捕获点,该捕获点之后可以被 longjmp 调用以发出错误信号。

输出
Error 101 happened


数据竞争

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

异常 (C++)

无异常保证:此宏从不抛出异常。

另见