【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 }