linux C全域性跳轉函式

2021-05-25 05:49:26 字數 2039 閱讀 5893

為什麼要有個函式間的跳轉呢,這是因為,如果我們在呼叫函式時,函式的呼叫的巢狀的層次很深的話,如果出錯,那麼一層一層的返回和判斷就很麻煩,所以,如果出錯,就可以直接返回到最上面的呼叫的函式就會很方便。

我們來看一下這兩個函式怎麼使用,首先看一下這兩個函式的原型:

#include

int setjmp(jmp_buf env);   //直接呼叫則返回0,如從longjmp呼叫則返回非0

int longjmp(jmp_buf env, int val);

jum_buf是乙個型別,其中env儲存了一些longjmp呼叫返回用來恢復棧狀態的所有資訊。longjmp中的env和setjmp中的 env是同乙個。val是程式設計師自定義的直,這個值用在setjmp的返回值中,這樣我們就可以知道是在哪個的longjmp跳轉回來的。另外,由於在不 同的函式間呼叫setjmp和longjmp,而這兩個函式要公用乙個env變數,所以把env定義為乙個全域性變數。

下面我們看乙個簡單的例子:

view plaincopy to clipboardprint?

#include

#include

jmp_buf jmpbuffer;  

void func1();  

void func2();  

int main(void)  

func1();  

printf("main function end! ");  

return 0;  

}  

void func1()  

void func2()  

#include

#include

jmp_buf jmpbuffer;

void func1();

void func2();

int main(void)

func1();

printf("main function end! ");

return 0;

}void func1()

void func2()

編譯:gcc main.c

執行:./a.out

輸出:

in main function!

in func1 function!

in func2 function!

get the error from jump return!

我們在程式中可以看到,我們在main函式用setjmp中設定了乙個接受跳轉返回的點,在func2函式中用longjmp跳轉返回。

在跳轉返回後,我們直接退出函式,那麼後面的

printf("main function end! ");

return 0;

這兩個語句將得不到執行。

前面我們說過longjmp函式中的val引數用來確定我們的jump是在哪產生的,下面我們修改一下前面的例子,看看怎樣區別不同的跳轉點。

view plaincopy to clipboardprint?

#include

#include

jmp_buf jmpbuffer;  

void func1();  

void func2();  

int main(void)  

func1();  

printf("main function end! ");  

return 0;  

}  

void func1()  

void func2()  

#include

#include

jmp_buf jmpbuffer;

void func1();

void func2();

int main(void)

func1();

printf("main function end! ");

return 0;

}void func1()

void func2()

sublime 全域性跳轉

我一般都是通過sublime建乙個project,然後將專案 資料夾乙個個加進工程,只用來看,寫都是在linux開發機器用vim 看 最大的需求就是查詢某個symbol的定義,和跳轉.在sublime環境剛配置好的時候,跳轉都很正常,整個project的檔案都會被索引並大部分都成功跳轉.但是後來一段...

Linux C語言內聯彙編 條件跳轉

void jump 當sum的約束條件是 r 時,內聯彙編中應該初始化一下,movl 0,0 相當於初始化sum的中轉暫存器 比如下面,編譯器選擇 edx來暫存sum,如果不清零操作,其中的值是不確定的 再看看生成的.s檔案 subq 16,rsp movl 10,4 rbp movl 0,8 rb...

Linux C 函式總結

linux c 的記憶體分配 3個儲存空間動態分配和乙個記憶體釋放的函式 malloc 記憶體分配指定位元組儲存區,初始值不為0 calloc 為指定個數的具有指定長度的物件分配儲存空間,每一位初始化為0 reallco 更改以前的分配區長度 可增,可減 當增加時,將以前的分配區內容遷移到乙個足夠大...