有時候,當接收到乙個訊號時,希望能跳回程式中以前的乙個位置執行。例如,在有
的程式內,當使用者按了中斷鍵,則程式跳回到顯示主選單執行。我們可以用庫系統呼叫
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通常...