setjmp與longjmp 用法之一

2021-04-20 04:19:39 字數 873 閱讀 2471

有時候,當接收到乙個訊號時,希望能跳回程式中以前的乙個位置執行。例如,在有

的程式內,當使用者按了中斷鍵,則程式跳回到顯示主選單執行。我們可以用庫系統呼叫

setjmp()和longjmp()來完成這項工作。setjmp()能儲存程式中的當前位置(是通過儲存堆疊

環境實現的),longjmp()能把控制轉回到被儲存的位置。在某種意義上,longjmp()是遠端跳

轉,而不是區域性區域內的跳轉。我們必須注意到,由於堆疊已經回到被儲存位置這一點,

所以longjmp()從來不返回。然而,與其對應的setjmp()是要返回的。

setjmp()和longjmp()在setjmp.h 中的定義分別如下:

int setjmp(jmp_buf env);

void longjmp(jmp_buf env, int val);

setjmp()只有乙個引數env,用來儲存程式當前位置的堆疊環境。而longjmp()有兩個參

數:引數env 是由setjmp()所儲存的堆疊環境。

引數val 設定setjmp()的返回值。longjmp()本身是沒有返回的,但其執行後跳轉到儲存

env 引數的setjmp()呼叫,並由setjmp()呼叫返回,就好像程式剛剛執行完setjmp()一樣,此

時setjmp()的返回值就是val。但是要注意的是,longjmp()呼叫不能使setjmp()呼叫返回0,

如果val 為0,則setjmp()的返回為1。

下面的例子演示了setjmp()和longjmp()的使用:

#include

#include

#include

jmp_buf position;

main()

goback()

全面了解setjmp與longjmp的使用

2006 7 7 6 50 00 by 風吹雨點飄 另外請特別注意,setjmp函式與longjmp函式總是組合起來使用,它們是緊密相關的一對操作,只有將它們結合起來使用,才能達到程式控制流有效轉移的目的,才能按照程式設計師的預先設計的意圖,去實現對程式中可能出現的異常進行集中處理。與goto語句的...

全面了解setjmp與longjmp的使用

將對setjmp與longjmp的具體使用方法和適用的場合,進行乙個非常全面的闡述。另外請特別注意,setjmp函式與longjmp函式總是組合起來使用,它們是緊密相關的一對操作,只有將它們結合起來使用,才能達到程式控制流有效轉移的目的,才能按照程式設計師的預先設計的意圖,去實現對程式中可能出現的異...

setjmp函式和longjmp函式

這兩個函式是為了解決深層次函式巢狀返回的問題。函式原型 include int setjmp jmp buf env 返回值 若直接呼叫則返回0,若從longjmp呼叫返回則返回非0值。void longjmp jmp buf env,int val 在希望返回的位置呼叫setjmp,引數env通常...