最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2013年09月10日 08:44:51   作者:  
以下是對C語言中的setjmp與longjmp函數(shù)進(jìn)行了詳細(xì)的介紹,需要的朋友可以過來參考下

setjmp和longjmp是C語言獨(dú)有的,只有將它們結(jié)合起來使用,才能達(dá)到程序控制流有效轉(zhuǎn)移的目的,按照程序員的預(yù)先設(shè)計(jì)的意圖,去實(shí)現(xiàn)對程序中可能出現(xiàn)的異常進(jì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ǎn)拗口,通俗的解釋是:先調(diào)用setjmp,用變量envbuf記錄當(dāng)前的位置,然后調(diào)用longjmp,返回envbuf所記錄的位置,并使setjmp的返回值為val。當(dāng)時用longjmp時,envbuf的內(nèi)容被銷毀了。其實(shí)這里的“位置”一詞真正的含義是棧定指針。

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

復(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)該更能體會這對函數(shù)的作用了吧。

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

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

相關(guān)文章

  • boost.asio框架系列之buffer函數(shù)

    boost.asio框架系列之buffer函數(shù)

    這篇文章介紹了boost.asio框架系列之buffer函數(shù),文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06
  • c++連接mysql入門案例

    c++連接mysql入門案例

    這篇文章主要介紹了c++連接mysql入門案例,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • 淺談C++不同繼承之間的關(guān)系

    淺談C++不同繼承之間的關(guān)系

    本文主要介紹了淺談C++不同繼承之間的關(guān)系,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • C++?Boost?MultiArray簡化使用多維數(shù)組庫

    C++?Boost?MultiArray簡化使用多維數(shù)組庫

    Boost是為C++語言標(biāo)準(zhǔn)庫提供擴(kuò)展的一些C++程序庫的總稱。Boost庫是一個可移植、提供源代碼的C++庫,作為標(biāo)準(zhǔn)庫的后備,是C++標(biāo)準(zhǔn)化進(jìn)程的開發(fā)引擎之一,是為C++語言標(biāo)準(zhǔn)庫提供擴(kuò)展的一些C++程序庫的總稱
    2022-11-11
  • 解析C++中的虛擬函數(shù)及其靜態(tài)類型和動態(tài)類型

    解析C++中的虛擬函數(shù)及其靜態(tài)類型和動態(tài)類型

    虛擬函數(shù)(Visual Function)亦常被成為虛函數(shù),是C++中的一個重要特性,本文我們就來解析C++中的虛擬函數(shù)及其靜態(tài)類型和動態(tài)類型
    2016-06-06
  • C語言實(shí)現(xiàn)進(jìn)制轉(zhuǎn)換函數(shù)的實(shí)例詳解

    C語言實(shí)現(xiàn)進(jìn)制轉(zhuǎn)換函數(shù)的實(shí)例詳解

    這篇文章主要介紹了C語言實(shí)現(xiàn)進(jìn)制轉(zhuǎn)換函數(shù)的實(shí)例詳解的相關(guān)資料,這里提供實(shí)現(xiàn)實(shí)例幫助大家實(shí)現(xiàn)改功能,需要的朋友可以參考下
    2017-08-08
  • 利用C語言替換文件中某一行的方法

    利用C語言替換文件中某一行的方法

    大家都知道C語言提供了文件操作,但是替換文件的某一行比較麻煩,下面是我使用的一個方法,現(xiàn)在分享給大家,有需要的朋友們可以參考借鑒。
    2016-09-09
  • 如何基于C++解決RTSP取流報(bào)錯問題

    如何基于C++解決RTSP取流報(bào)錯問題

    這篇文章主要介紹了如何基于C++解決RTSP取流報(bào)錯問題,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-08-08
  • C++實(shí)現(xiàn)棧的操作(push和pop)

    C++實(shí)現(xiàn)棧的操作(push和pop)

    這篇文章主要介紹了C++實(shí)現(xiàn)棧的操作(push和pop),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • C語言 動態(tài)內(nèi)存分配詳解

    C語言 動態(tài)內(nèi)存分配詳解

    這篇文章主要介紹了C語言 動態(tài)內(nèi)存分配詳解的相關(guān)資料,需要的朋友可以參考下
    2017-06-06

最新評論

铜梁县| 邵阳市| 镶黄旗| 青川县| 静宁县| 镇康县| 庄浪县| 龙胜| 科技| 宁津县| 昂仁县| 阿巴嘎旗| 大洼县| 岳西县| 侯马市| 上栗县| 邛崃市| 宜兴市| 西盟| 扎囊县| 肥乡县| 南郑县| 楚雄市| 万源市| 论坛| 镇坪县| 潮州市| 怀来县| 讷河市| 罗甸县| 蚌埠市| 祁连县| 杭州市| 手游| 微山县| 泸定县| 德保县| 青川县| 永川市| 漳州市| 德惠市|