在c語言中,我們可以使用setjmp和longjmp這兩個函數實現函數間的直接跳轉。
函數原型
其中函數原型如下:
#include <setjmp.h>
int setjmp(jmp_buf env);
void longjmp(jmp_buf env, int val);
其中setjmp 函數的功能是將函數在此處的上下文保存在 jmp_buf 結構體中,以供 longjmp 從此結構體中恢復。
- 參數 env 即為保存上下文的 jmp_buf 結構體變量;
- 如果直接調用該函數,返回值為 0; 若該函數從 longjmp 調用返回,返回值為非零,由 longjmp 函數提供。根據函數的返回值,我們就可以知道 setjmp 函數調用是第一次直接調用,還是由其它地方跳轉過來的。
longjmp 函數的功能是從 jmp_buf 結構體中恢復由 setjmp 函數保存的上下文,該函數不返回,而是從 setjmp 函數中返回。
- 參數 env 是由 setjmp 函數保存過的上下文。
- 參數 val 表示從 longjmp 函數傳遞給 setjmp 函數的返回值,如果 val 值為0, setjmp 將會返回1,否則返回 val。
longjmp 不直接返回,而是從 setjmp 函數中返回,longjmp 執行完之后,程序就像剛從 setjmp 函數返回一樣。
例子
#include <setjmp.h>
#include <stdlib.h>
#include <stdio.h>
int main() {
jmp_buf env;
int i;
i = setjmp(env);
printf("i = %d\n", i);
if(i != 0) exit(0);
longjmp(env, 2);
printf("this line does not get print");
return 0;
}
輸出為下:
i = 0
i = 2