網頁

2019年2月20日 星期三

【C++語言】setjmp.h

在setjmp.h裡面,可以處裡很多goto無法做到的事情,也就是神奇的跳躍方法。
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基金會的贊助。
您只需要支持我們,完全不會花到錢!