欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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ò)的所有位置間。

相關(guān)文章

  • C語(yǔ)言中如何通過(guò)指針參數(shù)返回值

    C語(yǔ)言中如何通過(guò)指針參數(shù)返回值

    這篇文章主要介紹了C語(yǔ)言中如何通過(guò)指針參數(shù)返回值問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • 基于C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)易掃雷游戲

    基于C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)易掃雷游戲

    這篇文章主要為大家詳細(xì)介紹了基于C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)易掃雷游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下<BR>
    2022-01-01
  • C++線程之thread詳解

    C++線程之thread詳解

    這篇文章主要為大家詳細(xì)介紹了C++線程中的thread,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-03-03
  • 在QT5中實(shí)現(xiàn)求兩個(gè)輸入值的和并輸出(實(shí)例)

    在QT5中實(shí)現(xiàn)求兩個(gè)輸入值的和并輸出(實(shí)例)

    下面小編就為大家?guī)?lái)一篇在QT5中實(shí)現(xiàn)求兩個(gè)輸入值的和并輸出(實(shí)例)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-08-08
  • C++ assert()函數(shù)用法案例詳解

    C++ assert()函數(shù)用法案例詳解

    這篇文章主要介紹了C++ assert()函數(shù)用法案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-09-09
  • c++ 智能指針基礎(chǔ)詳解

    c++ 智能指針基礎(chǔ)詳解

    這篇文章主要介紹了c++ 智能指針基礎(chǔ)的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用c++,感興趣的朋友可以了解下
    2021-02-02
  • C語(yǔ)言使用廣度優(yōu)先搜索算法解決迷宮問(wèn)題(隊(duì)列)

    C語(yǔ)言使用廣度優(yōu)先搜索算法解決迷宮問(wèn)題(隊(duì)列)

    這篇文章主要介紹了C語(yǔ)言使用廣度優(yōu)先搜索算法解決迷宮問(wèn)題,結(jié)合迷宮問(wèn)題分析了C語(yǔ)言隊(duì)列廣度優(yōu)先搜索算法的相關(guān)使用技巧,需要的朋友可以參考下
    2017-09-09
  • Qt?QTableWidget基本操作及使用

    Qt?QTableWidget基本操作及使用

    QTableWidget?是?Qt?中的表格組件類(lèi)。很類(lèi)似于VC、C#中的DataGrid,本文就詳細(xì)來(lái)介紹一下Qt?QTableWidget基本操作及使用,感興趣的可以了解一下
    2021-11-11
  • C語(yǔ)言實(shí)現(xiàn)字符串操作函數(shù)的實(shí)例

    C語(yǔ)言實(shí)現(xiàn)字符串操作函數(shù)的實(shí)例

    這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)字符串操作函數(shù)的實(shí)例的相關(guān)資料,開(kāi)發(fā)程序的時(shí)候經(jīng)常使用到一些字符串函數(shù),例如求字符串長(zhǎng)度,拷貝字符串……,需要的朋友可以參考下
    2017-08-08
  • C基礎(chǔ) mariadb處理的簡(jiǎn)單實(shí)例

    C基礎(chǔ) mariadb處理的簡(jiǎn)單實(shí)例

    下面小編就為大家?guī)?lái)一篇C基礎(chǔ) mariadb處理的簡(jiǎn)單實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-06-06

最新評(píng)論