setjmp和longjmp是C語言獨有的,只有將它們結(jié)合起來使用,才能達到程序控制流有效轉(zhuǎn)移的目的,按照程序員的預先設(shè)計的意圖,去實現(xiàn)對程序中可能出現(xiàn)的異常進行集中處理。
先來看一下這兩個函數(shù)的定義吧:
setjmp和longjmp的函數(shù)原型在setjmp.h中
函數(shù)原型:
int setjmp(jmp_buf envbuf);
setjmp函數(shù)用緩沖區(qū)envbuf保存系統(tǒng)堆棧的內(nèi)容,以便后續(xù)的longjmp函數(shù)使用。setjmp函數(shù)初次啟用時返回0值。
void longjmp(jmp_buf envbuf, int val);
longjmp函數(shù)中的參數(shù)envbuf是由setjmp函數(shù)所保存的堆棧環(huán)境,參數(shù)val設(shè)置setjmp函數(shù)的返回值。longjmp函數(shù)本身是沒有返回值的,它執(zhí)行后跳轉(zhuǎn)到保存envbuf參數(shù)的setjmp函數(shù)調(diào)用,并由setjmp函數(shù)調(diào)用返回,此時setjmp函數(shù)的返回值就是val。
上面的說明有點拗口,通俗的解釋是:先調(diào)用setjmp,用變量envbuf記錄當前的位置,然后調(diào)用longjmp,返回envbuf所記錄的位置,并使setjmp的返回值為val。當時用longjmp時,envbuf的內(nèi)容被銷毀了。其實這里的“位置”一詞真正的含義是棧定指針。
接著讓我們看一個小例子吧:
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();
}
}
仔細看一下應(yīng)該更能體會這對函數(shù)的作用了吧。
setjmp/longjmp的最大用處是錯誤恢復,類似try ...catch...
他們的功能比goto強多了,goto只能在函數(shù)體內(nèi)跳來跳去,而setjmp/longjmp可以在到過的所有位置間。
|
新聞熱點
疑難解答
圖片精選