名稱空間
變體
操作

setjmp

來自 cppreference.com
< c‎ | 程式
定義於標頭檔案 <setjmp.h>
#define setjmp(env) /* 實施定義 */

將當前執行上下文儲存到 jmp_buf 型別的變數 env 中。該變數稍後可用於透過 longjmp 函式恢復當前執行上下文。也就是說,當呼叫 longjmp 函式時,執行將在構造傳遞給 longjmpjmp_buf 變數的特定呼叫點繼續。在這種情況下,setjmp 返回傳遞給 longjmp 的值。

setjmp 的呼叫只能出現在以下上下文之一中

  1. ifswitchwhiledo-whilefor 的整個控制表示式。
    switch(setjmp(env)) { // ...
  2. 關係或相等運算子的一個運算元是整數常量表達式,另一個運算元是整數常量表達式,結果表示式是 ifswitchwhiledo-whilefor 的整個控制表示式。
    if(setjmp(env) > 10) { // ...
  3. 一元 ! 運算子的運算元,結果表示式是 ifswitchwhiledo-whilefor 的整個控制表示式。
    while(!setjmp(env)) { // ...
  4. 表示式語句 的整個表示式(可能轉換為 void)。
    setjmp(env);

如果 setjmp 出現在任何其他上下文中,則行為未定義。

返回到 setjmp 的作用域時

  • 所有可訪問物件、浮點狀態標誌和抽象機器的其他元件都具有與執行 longjmp 時相同的值,
  • 除了包含 setjmp 呼叫的函式中的非 volatile 區域性變數,如果自 setjmp 呼叫以來它們的值已更改,則它們的值是不確定的。

目錄

[編輯] 引數

env - 用於儲存程式執行狀態的變數。

[編輯] 返回值

0 如果宏由原始程式碼呼叫且執行上下文已儲存到 env

非零值,如果剛剛執行了非區域性跳轉。返回值與傳遞給 longjmp 的值相同。

[編輯] 注意

上述要求禁止在資料流中使用 setjmp 的返回值(例如,用它初始化或賦值物件)。返回值只能用於控制流或丟棄。

[編輯] 示例

#include <stdio.h>
#include <setjmp.h>
#include <stdnoreturn.h>
 
jmp_buf my_jump_buffer;
 
noreturn void foo(int status) 
{
    printf("foo(%d) called\n", status);
    longjmp(my_jump_buffer, status + 1); // will return status+1 out of setjmp
}
 
int main(void)
{
    volatile int count = 0; // modified local vars in setjmp scope must be volatile
    if (setjmp(my_jump_buffer) != 5) // compare against constant in an if
        foo(++count);
}

輸出

foo(1) called
foo(2) called
foo(3) called
foo(4) called

[編輯] 參考

  • C17 標準 (ISO/IEC 9899:2018)
  • 7.13.1.1 setjmp 宏 (p: 191)
  • C11 標準 (ISO/IEC 9899:2011)
  • 7.13.1.1 setjmp 宏 (p: 262-263)
  • C99 標準 (ISO/IEC 9899:1999)
  • 7.13.1.1 setjmp 宏 (p: 243-244)
  • C89/C90 標準 (ISO/IEC 9899:1990)
  • 4.6.1 setjmp 宏

[編輯] 另請參閱

跳轉到指定位置
(函式) [編輯]
C++ 文件,關於 setjmp