【C】——setjmp练习

1 #include<setjmp.h>
2 
3 int setjmp(jmp_buf env);
4     返回值:若直接调用则返回0,若从longjmp调用返回则返回非0值
5 
6 void longjmp(jmp_buf env, int val);

  在希望返回的位置调用setjmp,直接调用该函数返回值为0;参数env的类型是一个特殊类型jmp_buf。这一数据类型是某种形式的数组,其中存放在调用longjmp时能用来恢复栈状态的所有信息。

  longjmp的两个参数,第一个是在调用setjmp时所用的env;第二个参数是具有非零值的val,它将成为从setjmp处返回的值。使用第二个参数的原因是对于一个setjmp可以有多个longjmp。

  

 1 #include<stdio.h>
 2 #include<setjmp.h>
 3 #include<stdlib.h>
 4 
 5 jmp_buf jmpbuffer;
 6 
 7 void prnt2()
 8 {
 9     printf("this prnt2\n");
10 
11     longjmp(jmpbuffer, 2);    //每次调用函数的第二个参数不同,这是用来区分是哪个函数调用的longjmp
12 }
13 
14 void prnt1()
15 {
16     printf("this prnt1\n");
17     longjmp(jmpbuffer, 1);
18     prnt2();
19 }
20 
21 int main()
22 {
23 /*
24     if(setjmp(jmpbuffer) == 1){
25         printf("this is print1's longjmp\n");
26         exit(0);
27     }
28     if(setjmp(jmpbuffer) == 2){
29         printf("this is print2's longjmp\n");
30         exit(0);
31     }
32 */
33     switch(setjmp(jmpbuffer)){
34     case 0: printf("setjmp seccuss\n");    break;
35     case 1: printf("print1's longjmp\n");    exit(0);    break;
36     case 2: printf("print2's longjmp\n");     exit(0);    break;
37     }        
38     printf("this main\n");
39     prnt1();
40 
41     exit(0);
42 }

 

posted @ 2013-10-10 16:09  net小伙  阅读(335)  评论(0编辑  收藏  举报