C語言中的goto語句只能實現函數中的局部跳轉,並不能實現全局跳轉
查閱LinuxC 以後,簡介如何實現及運用全局跳轉(不同函數中的跳轉)
Linux 下的全局跳轉的實現及其原理:
所用的函數及其頭文件:
<setjmp.h>
setjmp();
longjmp()
在linux下的例子程序:
#include<stdio.h> 2 #include<setjmp.h> 3 jmp_buf env;//儲存棧幀 4 void f(void) - 5 { | 6 longjmp(env,10);//恢復env所保存的棧幀,longjmp參數的值作為setjmp的返回值 | 7 printf("this is after the function longjmp");//不執行該程序 | 8 } 9 10 int main() - 11 { | 12 int val; | 13 printf("this is before the function setjmp()\n"); | 14 val=setjmp(env);//進入setjmp函數,第一次進入功能是把當前函數棧幀保存在env中,當longjmp()返回 | 時仍在setjmp內部,返回longjmp中參數的值 | 15 if(val!=0)//第一次進入,即還沒有跳轉 |- 16 { || 17 printf("after long jump,the value is %d\n",val); || 18 }else//跳轉後的 |- 19 { || 20 printf("read to jump\n"); || 21 f(); || 22 } | 23 val=setjmp(env); | 24 printf("val=%d\n",val); | 25 return 0; | 26 }運行結果:this is before the function setjmp()
read to jump
after long jump,the value is 10
val=0
原理:
setjmp(env)函數把其所在的函數的棧幀保存在其jmp_buf類型的參數env中;
longjmp(env,10) longjmp 函數把env儲存的棧幀恢復,並跳轉到setjmp函數中,setjmp函數返回參數值10。
使用方法:
#include<stdio.h> #include<string.h> #include<setjmp.h> jmp_buf env; void f(void) { longjmp(env,1); } int main() { if() setjmp(env); return 0; }注意:再次使用setjmp()第一次儲存棧幀返回值為0