函数内部跳转---setjmp和longjmp

欢迎转载,请注明出处,本文地址:http://blog.csdn.net/jk050802/article/details/8631329

联系邮箱:yinfork@foxmail.com


函数原型:

         #include<setjmp.h>

         Intsetjmp(jmp_buf env);

返回值:若成功调用,则返回0,若从longjmp中调用返回,则返回更加longjmp的参数,返回一个非0的值。

 

Void longjmp(jmp_buf env,int val);

参数:val参数是用来设置在跳转到setjmp时,setjmp对应的返回值。(测试时发现假如设置val为0,setjmp也会返回一个非0)

 

简介

Goto语句是用来函数间的跳转,但是函数内部的跳转就是用setjmp和longjmp。有些人一提到局部跳转,就会觉得不好,降低代码的可读性。其实,在某些情况,调用goto或者longjmp等函数是很有用的,特别是在多层嵌套的语句中跳出循环和在出错的时候进行出错处理。这样从。不过使用这类函数,应该只跳出而不要跳入,即只从循环或者从出错语句中跳出,而不跳入。在Linux中,也有大量使用goto语句,不过仅限在错误处理中。

 

一般应用情况

         可以在一个函数内,对于非致命性错误,使用setjmp和longjmp进行错误处理。比如说假如在菜单选择里,接收到一个不属于菜单选择项里的选项。这时,可以用局部跳转,再跳转到请求输入菜单选项的位置里。

 

示例代码

#include <stdio.h>

#include <setjmp.h>

 

jmp_buf jmp_flag;

 

void done(char num)

{

       if(num > 'a')

                printf("enter %c issuccess\n",num);

       else {

                printf("enter %c iserror\n",num);

                longjmp(jmp_flag,1);

       }

}

 

int main(void)

{

       char i;;

 

       switch(setjmp(jmp_flag)) {

       case 0:

                printf("It's setjumpsuccess\n");

                break;

       case 1:

                printf("It's longjumpsuccess\n");

                break;

       }

 

       do {

                printf("please enter acharacter greater than a\n");

                printf("if you enter anumber will error\n");

                i = getchar();

                getchar();//the code can delete"enter" character

                done(i);

       }while(i != 'q');

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值