1. 程式人生 > >c中的setjump和longjump解析

c中的setjump和longjump解析

在做題中遇到的兩個函式,覺得有點意思,也是解題時理解程式碼的一個關鍵點,於是寫下來

我們知道c中goto這個指令不能跨函式跳躍,而setjump和longjump會解決這個問題。

標頭檔案:<setjump.h>

1.setjump(env)  其中env代表環境變數,表示將程式中的上下文儲存在env中。

2.longjump:void longjmp( std::jmp_buf env, int status );  env為指代 setjmp 所儲存的函式執行狀態的變數,

status表示從setjmp返回的值,若它等於0,則以1代替。常用於做異常處理。它的返回是在setjmp中。

下面示例一個程式碼:

#include<iostream>
#include<setjmp.h>
using namespace std;
jmp_buf env;
double divide(double a, double b) {
    if (b == 0)
    {
        longjmp(env, 2);
    }
    return a / b;
}
int main()
{
    
    if (setjmp(env) == 0) //longjmp會在這裡返回
    {
        cout << "ok"<<endl;
        divide(2, 0);
    }
    else {
        cout << "not ok";
    }
    return 0;
}

實質上main中的if判斷被執行了兩次。

參考:http://www.cnblogs.com/hazir/p/c_setjmp_longjmp.html