c setjmp 和 longjmp

相信大家对goto不会太陌生,但是恐怕setjmp和longjmp就不是很熟悉了。

 

以下是一段示例程序,将帮助你理解:

 

#include "setjmp.h"


//声明一个记录变量
jmp_buf buf;

void Banana(){
 printf("in banana()/n");
 //session 2:使用longjmp实现跳转回到buf记录的位置.且返回1
 longjmp(buf, 1);
 /*以下代码不会被执行*/
 printf("you'll never see this, because longjmp/n");
}

int main(int argc, char* argv[])
{
 printf("Hello World!/n");

 //session 1:使用setjmp,记录下当前的位置,保存于buf中.且返回0
 if(setjmp(buf)){
  printf("back in main/n");
 }else{
  printf("first time through/n");
  Banana();
 }

 //conclusion :可以使用setjmp 和 longjmp实现跳转,它们跟goto最大的区别在于
 //1)goto不能跳出C语言当前的函数(这也是longjmp取名的由来,它可以跳得很远,
 //甚至可以跳转到其他文件的函数中)
 //2)longjmp只能跳回曾经到过的地方(即setjmp调用的地方)
 //但是和goto一样 setjmp 和 longjmp同样会使程序变得难以理解和调试。如果不是出于特殊需要
 //最好避免使用它们
 return 0;
}

 

first time through

in banana()

back in main

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值