setjmp.h裡面有定義一個型別,叫做jmp_buf`,他是個陣列存放著跳躍時的必要資訊。
這裡面還有兩個函式,首先是
int setjmp(jmp_buf env);
如果這個函式是正常的自己回傳的,那麼回傳值為零;若這個函式是從別的地方跳來這裡,則回傳非零數值。再來是第二個函式
_Noreturn void longjmp(jmp_buf env, int val);
這個函式很明顯不會回傳,因為都跳到遙遠的地方了。這個函式會跳到env儲存的那個setjmp函式的位置。假如val是非零整數,那麼那一個抵達的setjmp會回傳val;若val等於零,則setjmp回傳1。我們看一下下方的程式
#include <setjmp.h>
#include <stdio.h>
jmp_buf buf;
int g(int x)
{
longjmp(buf, 3);
return 1;
}
int f(int x)
{
return g(x);
}
int main(void)
{
int ret = setjmp(buf);
printf("%d\n", ret);
if (!ret) {
f(1);
}
}