首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

setjmp

在头文件<setjmp.h>中定义

?

?

#define setjmp(env)/ *实现定义的* /

?

?

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

setjmp的调用只能出现在下列其中一个环境中:

  • 选择或迭代语句的整个控制表达式(if,switch,for,while,do-while)
代码语言:javascript
复制
switch(setjmp(env)) { ..
  • 一个关系或相等运算符的操作数,另一个操作数是一个整型常量表达式,结果表达式是选择或迭代语句的整个控制表达式
代码语言:javascript
复制
if(setjmp(env) > 10) { ...
  • 一元操作数!运算符的结果表达式是选择或迭代语句的完整控制表达式
代码语言:javascript
复制
while(!setjmp(env)) { ...
  • 表达式语句的整个表达式(可能转换为void)。
代码语言:javascript
复制
setjmp(env);

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

返回到setjmp的范围后,抽象机器的所有可访问对象,浮点状态标志和其他组件都具有与执行longjmp时相同的值,除了setjmp作用域中的非易失性局部变量如果自从setjmp调用以来它们已被更改,则值是不确定的。

参数

env

-

变量来保存程序的执行状态。

返回值

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

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

代码语言:javascript
复制
#include <stdio.h>
#include <setjmp.h>
#include <stdnoreturn.h>
 
jmp_buf jump_buffer;
 
noreturn void a(int count) 
{
    printf("a(%d) called\n", count);
    longjmp(jump_buffer, count+1); // will return count+1 out of setjmp
}
 
int main(void)
{
    volatile int count = 0; // modified local vars in setjmp scope must be volatile
    if (setjmp(jump_buffer) != 9) // compare against constant in an if
        a(++count);
}

输出:

代码语言:javascript
复制
a(1) called
a(2) called
a(3) called
a(4) called
a(5) called
a(6) called
a(7) called
a(8) called

参考

  • 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宏

扩展内容

longjmp

跳转到指定的位置(功能)

| 用于setjmp的C ++文档 |

扫码关注腾讯云开发者

领取腾讯云代金券

http://www.vxiaotou.com