C/C++庫函數使用———setjmp.h

setjmp庫裏的函數:void longjmp (jmp_buf env, int val)和int setjmp(jmp_buf env)

void longjmp (jmp_buf env, int val)的使用:恢復env所指的緩衝區中的程序調用環境上下文,env所指緩衝區的內容是由setjmp子程序,調用所保存。value的值從longjmp傳遞給setjmplongjmp完成後,程序從對應的setjmp調用處繼續執行,如同setjmp調用剛剛完成。如果value傳遞給longjmp零值,setjmp的返回值爲1;否則,setjmp的返回值爲value

int setjmp(jmp_buf env)的使用:建立本地的jmp_buf緩衝區並且初始化,用於將來跳轉回此處。這個子程序保存程序的調用環境於env參數所指的緩衝區,env將被longjmp使用。如果是從setjmp直接調用返回,setjmp返回值爲0。如果是從longjmp恢復的程序調用環境返回,setjmp返回非零值

例子

#include <stdio.h>
#include <setjmp.h>

static jmp_buf buf;

void second(void) {
    printf("second\n");         // 打印
    longjmp(buf,1);             // 跳回setjmp的調用處 - 使得setjmp返回值爲1
}

void first(void) {
    second();
    printf("first\n");          // 不可能執行到此行
}

int main() {   
    if ( ! setjmp(buf) ) {
        first();                // 進入此行前,setjmp返回0
    } else {                    // 當longjmp跳轉回,setjmp返回1,因此進入此行
        printf("main\n");       // 打印
    }

    return 0;
}
上述程序將輸出:
second
main

例子解釋:注意到雖然first()子程序被調用,"first"不可能被打印。"main"被打印,因爲條件語句if ( ! setjmp(buf) )被執行第二次

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章