C语言setjmp函数使用

C语言中可以使用goto进行程序跳转,但是goto只能使用在一个函数内部,不能实现在不同函数之间的跳转,C语言因此提供了setjmp和longjmp函数实现此功能,一般进行异常处理。
从函数名称可以看到,一个是设置跳转点,另一个实现长距离的跳转。我们可以再一个函数内部调用setjmp函数设置一个跳转点,在另一个函数中调用longjmp进行跳转,我们需要定义一个jmp_buf类型变量保存跳转信息。
eg:
 
jmp_buf  jb  ;
 
void  main  ()
{
     if  ( setjmp  ( jb ) == 0)
    {
         longjmp ( jb  , 1);
    }
     else
    {
         printf ( "jmp point 1"  );
    } 
}
调用longjmp调用时,第二参数会作为setjmp函数的返回值,因此我们还可以用一个switch语句多个分支进行处理。
eg:
jmp_buf  jb  ;
 
void  main  ()
{
     int  code  =  setjmp (  jb );
     switch ( code  )
    {
     case  0:
         longjmp ( jb  , 1);
         break ;
     case  1:
         printf ( "jmp point 1"  );
         break ;
     default :
         printf ( "jmp point code is : %d"  ,  code );
         break ;
    }
}
看云风的说法,调用longjmp跳转时并不是在汇编级别的直接跳转,还进行了其他操作,看汇编我们也可以看到,程序并不是进行直接跳转,而是进行了一大堆操作,这样的跳转可以用作一场处理,类似于C++中的try,catch操作,我自己没有大量用过,网上说法是在不熟悉的情况下不赞成使用,这些函数也只在大型的项目中使用,而且程序员对此函数的用法十分娴熟。

转载于:https://www.cnblogs.com/ourroad/p/3212286.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值