程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> 淺析C說話中的setjmp與longjmp函數

淺析C說話中的setjmp與longjmp函數

編輯:關於C++

淺析C說話中的setjmp與longjmp函數。本站提示廣大學習愛好者:(淺析C說話中的setjmp與longjmp函數)文章只能為提供參考,不一定能成為您想要的結果。以下是淺析C說話中的setjmp與longjmp函數正文


setjmp和longjmp是C說話獨有的,只要將它們聯合起來應用,能力到達法式掌握流有用轉移的目標,依照法式員的事後設計的意圖,去完成對法式中能夠湧現的異常停止集中處置。

先來看一下這兩個函數的界說吧:

setjmp和longjmp的函數原型在setjmp.h中

函數原型:
int setjmp(jmp_buf envbuf);

setjmp函數用緩沖區envbuf保留體系客棧的內容,以便後續的longjmp函數應用。setjmp函數首次啟用時前往0值。

void longjmp(jmp_buf envbuf, int val);

longjmp函數中的參數envbuf是由setjmp函數所保留的客棧情況,參數val設置setjmp函數的前往值。longjmp函數自己是沒有前往值的,它履行後跳轉到保留envbuf參數的setjmp函數挪用,並由setjmp函數挪用前往,此時setjmp函數的前往值就是val。

下面的解釋有點拗口,淺顯的說明是:先挪用setjmp,用變量envbuf記載以後的地位,然後挪用longjmp,前往envbuf所記載的地位,並使setjmp的前往值為val。其時用longjmp時,envbuf的內容被燒毀了。其實這裡的“地位”一詞真實的寄義是棧定指針。

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

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

}

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

細心看一下應當更能領會這對函數的感化了吧。

setjmp/longjmp的最年夜用途是毛病恢復,相似try ...catch...

他們的功效比goto強多了,goto只能在函數體內跳來跳去,而setjmp/longjmp可以在到過的一切地位間。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved