命名空间
变体
操作

setjmp

来自 cppreference.com
< c‎ | program
定义在头文件 <setjmp.h>
#define setjmp(env) /* 实现定义的 */

将当前执行上下文保存到 env 变量中,env 变量的类型为 jmp_buf。稍后可以使用此变量通过 longjmp 函数恢复当前执行上下文。也就是说,当调用 longjmp 函数时,执行将继续在构造传递给 longjmpjmp_buf 变量的特定调用站点处继续。在这种情况下,setjmp 返回传递给 longjmp 的值。

setjmp 的调用只能出现在以下上下文之一中

  1. ifswitchwhiledo-whilefor 的整个控制表达式。
    switch(setjmp(env)) { // ...
  2. 关系运算符或相等运算符的一个操作数,另一个操作数是一个整数常量表达式,生成的表达式是 ifswitchwhiledo-whilefor 的整个控制表达式。
    if(setjmp(env) > 10) { // ...
  3. 一元 ! 运算符的操作数,生成的表达式是 ifswitchwhiledo-whilefor 的整个控制表达式。
    while(!setjmp(env)) { // ...
  4. 表达式语句 的整个表达式(可能被强制转换为 void)。
    setjmp(env);

如果 setjmp 出现在任何其他上下文中,则行为未定义。

返回到 setjmp 的作用域后

  • 所有可访问的对象、浮点状态标志和抽象机的其他组件都具有与执行 longjmp 时相同的数值,
  • 除了包含 setjmp 调用的函数中的非-volatile 局部变量,如果这些变量自 setjmp 调用后已更改,则它们的数值是不确定的。

内容

[编辑] 参数

env - 用于保存程序执行状态的变量。

[编辑] 返回值

0 如果宏是由原始代码调用的,并且执行上下文已保存到 env 中。

如果刚刚执行了非本地跳转,则为非零值。返回值与传递给 longjmp 的值相同。

[编辑] 说明

上述要求禁止在数据流中使用 setjmp 的返回值(例如,用它初始化或为它分配对象)。返回值只能用于控制流或被丢弃。

[编辑] 示例

#include <stdio.h>
#include <setjmp.h>
#include <stdnoreturn.h>
 
jmp_buf my_jump_buffer;
 
noreturn void foo(int status) 
{
    printf("foo(%d) called\n", status);
    longjmp(my_jump_buffer, status + 1); // will return status+1 out of setjmp
}
 
int main(void)
{
    volatile int count = 0; // modified local vars in setjmp scope must be volatile
    if (setjmp(my_jump_buffer) != 5) // compare against constant in an if
        foo(++count);
}

输出

foo(1) called
foo(2) called
foo(3) called
foo(4) called

[编辑] 参考资料

  • C17 标准 (ISO/IEC 9899:2018)
  • 7.13.1.1 setjmp 宏 (p: 191)
  • C11 标准 (ISO/IEC 9899:2011)
  • 7.13.1.1 setjmp 宏 (p: 262-263)
  • C99 标准 (ISO/IEC 9899:1999)
  • 7.13.1.1 setjmp 宏 (p: 243-244)
  • C89/C90 标准 (ISO/IEC 9899:1990)
  • 4.6.1 setjmp 宏

[编辑] 另请参阅

跳转到指定位置
(函数) [编辑]
C++ 文档 对于 setjmp