日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C异常处理机制:setjmp和longjmp

發(fā)布時間:2025/3/15 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C异常处理机制:setjmp和longjmp 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

setjmp()和longjum()是通過操縱過程活動記錄實現(xiàn)的。它是C語言所獨有的。它們部分你不了C語言有限的轉(zhuǎn)移能力。這個兩個函數(shù)協(xié)同工作,如下所示:
??? *setjmp(jmp_buf j)必須首先被調(diào)用。它表示“使用變量j記錄現(xiàn)在的位置。函數(shù)返回零。”
??? *longjmp(jmp_buf j,int i)可以接著被調(diào)用。它表示“回到j(luò)所記錄的位置,讓它看上去像是從原來的setjmp()函數(shù)返回一樣。但是函數(shù)返回i,使代碼知道它實際上是通過longjmp()返回的。“坳口不?
??? *當(dāng)使用longjmp()時,j的內(nèi)容被銷毀。
??? setjmp保存了一份程序的計數(shù)器和當(dāng)前的棧頂指針。如果喜歡也可以保存一些初始值。longjmp恢復(fù)這些值,有效的轉(zhuǎn)移控制并把狀態(tài)重置回保存狀態(tài)的時候。這被稱做“展開堆棧(unwinding stack)",因為你從堆棧中展開過程活動記錄,直到取得保存在其中的值。盡管longjmp會導(dǎo)致轉(zhuǎn)移,但它和goto又有不同,區(qū)別如下:
??? *goto語句不能跳出C語言當(dāng)前的函數(shù)(這也是“l(fā)ongjmp”取名的由來,它可以跳的很遠,甚至可以跳到其他文件的函數(shù)中)。
??? *用longjmp只能跳回到曾經(jīng)到過的地方。在setjmp的地方仍留有一個過程活動記錄。從這個角度講,longjmp更像是“從何處阿里(come from)“而不是”往哪里去(go to)”。longjmp接受一個額外的整型參數(shù)并返回它的值,這可以知道是由longjmp轉(zhuǎn)移到這里的還是從上條語句執(zhí)行后自然而然來的這里的。
??? 下面的代碼顯示了setjmp()和longjmp()一例。
???? #include <stdio.h>
???? #include <setjmp.h>
???? jmp_buf buf;
?
???? banana() {
???????? printf("%s","in banana() \n");
???????? longjmp(buf,1);
???????? printf("%s","you will never see this \n");
???? }
?
???? int main() {
???????? if(setjmp(buf)) {
???????????? printf("%s","back in main\n");
???????? }
???????? else {
???????????? printf("%s","first time throught\n");
???????????? banana();
???????? }
???? }
??? 輸出結(jié)果如下:
??? first time throught
??? in banana()
??? back in main
??? 需要注意的地方是:保證局部變量在longjmp過程中一直保持它的值的唯一可靠方法是把它聲明為volatile(這使用于那些值在setjmp執(zhí)行和longjmp返回之間會改變的變量)
??? setjmp/longjmp最大的用途是錯誤恢復(fù)。只要還沒有從函數(shù)中返回,一旦發(fā)現(xiàn)一個不可恢復(fù)的錯誤,可以把控制轉(zhuǎn)移到主輸入循環(huán),并從那里重新開始。有些人使用setjmp/longjmp從一串無數(shù)的函數(shù)調(diào)用中立即返回。還有些人用它們防范潛在的危險代碼。
??? setjmp/longjmp在C++中演變?yōu)楦胀ǖ漠惓L幚頇C制"catch"和"throw"。

總結(jié)

以上是生活随笔為你收集整理的C异常处理机制:setjmp和longjmp的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。