国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > C > 正文

淺析C語(yǔ)言中的setjmp與longjmp函數(shù)

2020-01-26 15:54:11
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

setjmp和longjmp是C語(yǔ)言獨(dú)有的,只有將它們結(jié)合起來(lái)使用,才能達(dá)到程序控制流有效轉(zhuǎn)移的目的,按照程序員的預(yù)先設(shè)計(jì)的意圖,去實(shí)現(xiàn)對(duì)程序中可能出現(xiàn)的異常進(jìn)行集中處理。

先來(lái)看一下這兩個(gè)函數(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ù)初次啟用時(shí)返回0值。

void longjmp(jmp_buf envbuf, int val);

longjmp函數(shù)中的參數(shù)envbuf是由setjmp函數(shù)所保存的堆棧環(huán)境,參數(shù)val設(shè)置setjmp函數(shù)的返回值。longjmp函數(shù)本身是沒(méi)有返回值的,它執(zhí)行后跳轉(zhuǎn)到保存envbuf參數(shù)的setjmp函數(shù)調(diào)用,并由setjmp函數(shù)調(diào)用返回,此時(shí)setjmp函數(shù)的返回值就是val。

上面的說(shuō)明有點(diǎn)拗口,通俗的解釋是:先調(diào)用setjmp,用變量envbuf記錄當(dāng)前的位置,然后調(diào)用longjmp,返回envbuf所記錄的位置,并使setjmp的返回值為val。當(dāng)時(shí)用longjmp時(shí),envbuf的內(nèi)容被銷(xiāo)毀了。其實(shí)這里的“位置”一詞真正的含義是棧定指針。

接著讓我們看一個(gè)小例子吧:

復(fù)制代碼 代碼如下:

#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();
    }

}


這段代碼的打印結(jié)果是:
first time through
in banana()
back in main

仔細(xì)看一下應(yīng)該更能體會(huì)這對(duì)函數(shù)的作用了吧。

setjmp/longjmp的最大用處是錯(cuò)誤恢復(fù),類(lèi)似try ...catch...

他們的功能比goto強(qiáng)多了,goto只能在函數(shù)體內(nèi)跳來(lái)跳去,而setjmp/longjmp可以在到過(guò)的所有位置間。

發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 新竹县| 卫辉市| 涟水县| 陇西县| 青铜峡市| 松桃| 宜章县| 高尔夫| 冕宁县| 屏山县| 长岭县| 黑龙江省| 娱乐| 郯城县| 涪陵区| 若尔盖县| 保定市| 上林县| 高要市| 岳普湖县| 通许县| 宿迁市| 西和县| 武宁县| 林芝县| 达日县| 青海省| 南雄市| 栖霞市| 苏尼特右旗| 丹江口市| 团风县| 固镇县| 泊头市| 钟祥市| 安塞县| 白城市| 宁安市| 友谊县| 沂源县| 无锡市|