在C语言中,我们都知道goto语句可以用来实现循环,实质上就是一个局部跳转语句(同一个函数作用域内)。我们同样可以把它用于局部异常处理。
那么如果要实现非局部跳转显然goto语句就无能为力了,所以在<setjmp.h>头文件中声明了setjmp()与setlong()函数用于实现非局部跳转,它允许立即从一个深层嵌套的函数调用中返回。
int setjmp(jmp_buf env);
返回值:第一次调用返回0,其后返回longjmp中val的值
void longjmp(jmp_buf env,int val);
调用次函数会调到setjmp()所在的地方,env同setjmp是一样的用以保存状态信息,val则是跳转到setjmp后我们自己规定的它的返回值。
有了这对函数,我们不仅可以实现非局部的跳转,还可以利用他们做C语言的异常处理。
实例代码:
#include<stdio.h>
#include<setjmp.h>
jmp_buf buffer;
int fun1(int a,int b)
{
if (b == 0)
{
longjmp(buffer, 1);
}
return a / b;
}
int main(void)
{
int a, b,rs;
printf("Pease input two number to except\n");
scanf("%d%d",&a,&b);
int r = setjmp(buffer);
if (r == 0)
{
rs = fun1(a, b);
printf("rs=%d\n",rs);
}
if (r == 1)
{
printf("Input error,Please do again\n");
scanf("%d%d", &a, &b);
rs = fun1(a, b);
printf("rs=%d\n", rs);
}
return 0;
}
此代码用C语言处理了两数除加可能出现的异常,主函数中设置setjmp()接受异常并对异常做出处理,fun1()中,如果出现异常则用longjmp()跳转到主函数中去处理异常。