函式
<csetjmp>

longjmp

void longjmp (jmp_buf env, int val);
長跳轉
將環境恢復到由 env 指示的狀態,使填充 envsetjmp 表示式的求值結果為 val

該函式永遠不會返回到其被呼叫的位置。相反,函式會將控制權轉移到上次使用 setjmp 填充 env 的位置,並將整個表示式的求值結果設為 val(除非 val 為零,此時求值結果為 1)。

如果 env 不是由先前對 setjmp 的呼叫所填充,或者包含該呼叫的函式已經終止執行,則會導致未定義行為

在 C++ 中,實現可能會執行棧展開,這會銷燬具有自動生命週期的物件。如果這呼叫了任何非平凡解構函式,則會導致未定義行為

引數

env
由先前對 setjmp 的呼叫填充的 jmp_buf 型別的物件,包含將環境恢復到該點所需的資訊。
val
setjmp 表示式的求值結果。
如果該值為零,則表示式的求值結果為 1

返回值

無(該函式永不返回)。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/* longjmp example */
#include <stdio.h>      /* printf */
#include <setjmp.h>     /* jmp_buf, setjmp, longjmp */

main()
{
  jmp_buf env;
  int val;

  val=setjmp(env);

  printf ("val is %d\n",val);

  if (!val) longjmp(env, 1);

  return 0;
}

輸出
val is 0
val is 1


資料競爭

setjmplongjmp 對的作用域僅限於當前執行緒。

異常 (C++)

如果在潛在的棧展開中不涉及任何具有非平凡解構函式的自動物件,則此函式永遠不會丟擲異常(no-throw 保證)。
否則,將導致未定義行為

另見