<csetjmp>

setjmp

int setjmp (jmp_buf env);
儲存呼叫環境以進行長跳轉
此宏以函式形式將當前程式碼執行點的呼叫環境資訊填充到 env 中,以便後續透過呼叫 longjmp 來恢復。

使用儲存在 env 中的資訊呼叫 longjmp 會恢復相同的狀態,並將控制權返回到該點(setjmp 的呼叫),該呼叫被評估為一個特定的非零值。

呼叫環境的狀態包括所有可訪問物件的數值,但不包括區域性函式中自動持續時間的物件,除非它們具有 volatile 限定的型別並且在呼叫 longjmp 之前發生更改;這些物件的數值是未定義的。

setjmp 的呼叫應單獨作為表示式語句,或者在選擇語句或迭代語句中進行評估,作為(可能被否定的)整個控制表示式,或者與整型常量表達式進行比較。否則,將導致未定義行為

引數

env
用於儲存環境資訊的 jmp_buf 型別物件。

返回值

此宏可能返回多次:第一次是直接呼叫時;在這種情況下,它始終返回零。
當使用設定到 env 的資訊呼叫 longjmp 時,宏會再次返回;這次它返回傳遞給 longjmp 的第二個引數的值(如果該值不為零),或者如果為零則返回 1

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/* setjmp example: error handling */
#include <stdio.h>      /* printf, scanf */
#include <stdlib.h>     /* exit */
#include <setjmp.h>     /* jmp_buf, setjmp, longjmp */

main()
{
  jmp_buf env;
  int val;

  val = setjmp (env);
  if (val) {
    fprintf (stderr,"Error %d happened",val);
    exit (val);
  }

  /* code here */

  longjmp (env,101);   /* signaling an error */

  return 0;
}

該函式使用 setjmp 設定一個捕獲點,該捕獲點之後可以被 longjmp 呼叫以發出錯誤訊號。

輸出
Error 101 happened


資料競爭

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

異常 (C++)

無異常保證:此宏從不丟擲異常。

另見