int setjmp(jmp_buf env)
void longjmp(jmp_buf env,int val)
setjmp与longjmp结合使用时,最大用途是错误恢复,只要还没有从主函数退出,一旦发现一个不可恢复的错误,可以把主控制转移大主函数循环,并从那从新开始。
它们必须有严格的先后执行顺序,也即先调用setjmp函数,之后再调用longjmp函数,以恢复到先前被保存的“程序执行点”。否则,如果在setjmp调用之前,执行longjmp函数,将导致程序的执行流变的不可预测,很容易导致程序崩溃而退出。
longjmp函数中的参数env是由setjmp函数所保存的堆栈环境,参数val设置setjmp函数的返回值。longjmp函数本身是没有返回值的,它执行后跳转到保存envb参数setjmp函数调用,并由setjmp函数调用返回,此时setjmp函数的返回值就是val。
setjmp与longjmp的使用场合:
1.人们对于goto语句的忌讳,很多的专业书籍以及专业人士号召限制goto语句的使用,此时,setjmp与longjmp对goto语句有了很好的替代作用.
2.goto语句有一个局限性,它只能在函数内部跳转.而setjmp与longjmp可以在整个程序全局中跳转,实现"长跳转",弥补了goto功能的局限.
3.使用setjmp和longjmp可以捕捉程序中的异常,并采取异常处理机制.
一个例子 使用setjmp,longjmp处理异常.
1 #include
2 #include
3 jmp_buf jumper;
4 void exception();
5 int deal_exception();
6
7 main()
8 {
9 int value;
10 int i=0;
11
12 value=setjmp(jumper);
13 if(0==value){
14 exception();
15 }
16 else{
17 switch(value)
18 {
19 case 1:
20 printf("解决异常情况[%d]\n",value);
21 break;
22 case 2:
23 printf("解决异常情况[%d]\n",value);
24 break;
25 case 3:
26 printf("解决异常情况[%d]\n",value);
27 break;
28
29 default:
30
31 break;
32 }
33 }
34 }
35 void exception()
36 {
37 int _err_no;
38 if(_err_no=3){
39 printf("出现异常情况[%d]\n",_err_no);
40 longjmp(jumper,_err_no);
41 }
42 return;
43 }
结果:
出现异常情况[3]
解决异常情况[3]
1 #include
2 #include
3
4 static jmp_buf buf;
5 int main()
6 {
7 int b;
8 b = 3;
9
10 if (setjmp(buf) != 0)
11 {
12 printf("b=%d\n", b);
13 return 0;
14 }
15 b = 5;
16 longjmp(buf, 1);
17
18 return 0;
19 }
setjmp执行时返回0,执行b=5,调用longjmp(buf,1),跳转到setjmp(buf)调用,setjmp(buf)返回1,处打印b=5
阅读(740) | 评论(0) | 转发(0) |