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
傳遞給setjmp
。longjmp
完成後,程序從對應的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) )被執行第二次