欢迎转载,请注明出处,本文地址: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');
}