歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux技術 >> linux下如何實現全局跳轉

linux下如何實現全局跳轉

日期:2017/3/3 14:10:31   编辑:Linux技術

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

Copyright © Linux教程網 All Rights Reserved