全局跳转函数 setjmp 和 longjmp

#include<setjmp.h>
int setjmp(jmp_buf env);//设置跳转点,jmp_buf类型是一种特殊类型,是某种形式的数组,用来当从longjmp返//回时恢复栈状态的所有信息,因为需要在longjmp函数中使用env,所以应将其定义为全局变量。
//返回值:若直接调用返回0,若从longjmp中返回则为非零
void longjmp(jmp_buf env,int val); //实现跳转功能,跳转到设置的跳转点,val的值为setjmp的返回值。

goto语句对于跳出多层循环很有用,但是他只能在本个函数内跳转,不能跨越函数跳转,而函数setjmp和longjmp可以实现跨越函数的跳转,这在对处理发生在很深层嵌套函数调用中的出错情况非常有用。

当longjmp 返回main函数时,这些变量的值是否能恢复到以前调用setjmp时的值,或者这些变量的值保持为调用do_line时的值?回答是:看情况。大多数实现并不会回滚自动变量和寄存器的值,而所有标准称他们的值是不确定的,如果你有一个自动变量,而不想使其回滚,则可定义其具有volatile属性。声明为全局变量和静态变量的值在longjmp函数返回时不变。

例子:

在这里插入图片描述
在这里插入图片描述

执行结果:
在这里插入图片描述
但不进行任何优化编译则自动变量和寄存器值不会回滚,当进行优化编译,其值回滚。

参考资料:
[1] unix环境高级编程(三版) 179页

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值