麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > C > 正文

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

2020-01-26 15:54:11
字體:
供稿:網(wǎng)友

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)容被銷毀了。其實這里的“位置”一詞真正的含義是棧定指針。

接著讓我們看一個小例子吧:

復制代碼 代碼如下:

#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

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

setjmp/longjmp的最大用處是錯誤恢復,類似try ...catch...

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

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 欧美日韩国产成人在线 | 久久网站热最新地址 | 国产精品视频一区二区三区四区国 | 亚洲成人免费电影 | 日韩激情 | 久久亚洲精品久久国产一区二区 | 久草影音| 毛片在线免费观看完整版 | 色就操 | 亚洲视屏 | 国产亚洲精久久久久久蜜臀 | 国产精品色在线网站 | 成人免费入口 | 国产免费午夜 | 日韩毛片免费观看 | 天天鲁在线视频免费观看 | 在线观看免费av网 | 一区二区三区视频在线 | 欧美成人免费 | 黄网站免费观看视频 | 中国洗澡偷拍在线播放 | 国产亚洲综合一区二区 | 草莓视频在线导航 | 91精品国产777在线观看 | 国产女厕一区二区三区在线视 | 色阁阁69婷婷 | 中文字幕精品亚洲 | 九九热欧美 | 性爱免费视频 | 在线看日本 | 在线播放91 | 国产va在线观看免费 | 黄色片免费看网站 | av色先锋 | 九九福利视频 | www.三区| 在线a视频| 91精品国产91久久久 | 久久久久久久久久综合 | 免费黄色成人 | 日韩视频一区 |