【C】——setjmp練習

6182 ワード

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の2つのパラメータ、1つ目はsetjmpを呼び出すときに使用されるenvです.2番目のパラメータは、setjmpから返される値になるゼロ以外の値を持つvalです.2番目のパラメータを使用する理由は、1つの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
"); 10 11 longjmp(jmpbuffer, 2);    // , longjmp 12 } 13 14 void prnt1() 15 { 16 printf("this prnt1
"); 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
");
26 exit(0); 27 } 28 if(setjmp(jmpbuffer) == 2){ 29 printf("this is print2's longjmp
");
30 exit(0); 31 } 32 */ 33 switch(setjmp(jmpbuffer)){ 34 case 0: printf("setjmp seccuss
"); break; 35 case 1: printf("print1's longjmp
"); exit(0); break; 36 case 2: printf("print2's longjmp
"); exit(0); break; 37 } 38 printf("this main
"); 39 prnt1(); 40 41 exit(0); 42 }