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);
}
}
他會先執行一次setjmp,然後抵達f(x)、g(x),並且跳回setjmp,其輸出值:0
3
👉【幫我們一個忙!】👈
👋如果您喜歡這篇文章,請在下方按5個Like!
❤您的支持是我們最大的動力!
您只要登入帳號(Facebook、Google),在下方按5個Like,我們就會收到來自LikeCoin基金會的贊助。
您只需要支持我們,完全不會花到錢!