淺析C說話中的setjmp與longjmp函數。本站提示廣大學習愛好者:(淺析C說話中的setjmp與longjmp函數)文章只能為提供參考,不一定能成為您想要的結果。以下是淺析C說話中的setjmp與longjmp函數正文
setjmp和longjmp是C說話獨有的,只要將它們聯合起來應用,能力到達法式掌握流有用轉移的目標,依照法式員的事後設計的意圖,去完成對法式中能夠湧現的異常停止集中處置。
先來看一下這兩個函數的界說吧:
setjmp和longjmp的函數原型在setjmp.h中
函數原型:
int setjmp(jmp_buf envbuf);
setjmp函數用緩沖區envbuf保留體系客棧的內容,以便後續的longjmp函數應用。setjmp函數首次啟用時前往0值。
void longjmp(jmp_buf envbuf, int val);
longjmp函數中的參數envbuf是由setjmp函數所保留的客棧情況,參數val設置setjmp函數的前往值。longjmp函數自己是沒有前往值的,它履行後跳轉到保留envbuf參數的setjmp函數挪用,並由setjmp函數挪用前往,此時setjmp函數的前往值就是val。
下面的解釋有點拗口,淺顯的說明是:先挪用setjmp,用變量envbuf記載以後的地位,然後挪用longjmp,前往envbuf所記載的地位,並使setjmp的前往值為val。其時用longjmp時,envbuf的內容被燒毀了。其實這裡的“地位”一詞真實的寄義是棧定指針。
接著讓我們看一個小例子吧:
#include <stdio.h>
#include <setjmp.h>
jmp_buf buf;
banana(){
printf("in banana() \n");
longjmp(buf,1);
printf("you'll never see this,because i longjmp'd");
}
main()
{
if(setjmp(buf))
printf("back in main\n");
else{
printf("first time through\n");
banana();
}
}
這段代碼的打印成果是:
first time through
in banana()
back in main
細心看一下應當更能領會這對函數的感化了吧。
setjmp/longjmp的最年夜用途是毛病恢復,相似try ...catch...
他們的功效比goto強多了,goto只能在函數體內跳來跳去,而setjmp/longjmp可以在到過的一切地位間。