setjmp
來自 cppreference.com
定義於標頭檔案 <setjmp.h> |
||
#define setjmp(env) /* 實施定義 */ |
||
將當前執行上下文儲存到 jmp_buf 型別的變數 env
中。該變數稍後可用於透過 longjmp 函式恢復當前執行上下文。也就是說,當呼叫 longjmp 函式時,執行將在構造傳遞給 longjmp 的 jmp_buf 變數的特定呼叫點繼續。在這種情況下,setjmp
返回傳遞給 longjmp 的值。
setjmp
的呼叫只能出現在以下上下文之一中
- if、switch、while、do-while、for 的整個控制表示式。
switch(setjmp(env)) { // ...
- 關係或相等運算子的一個運算元是整數常量表達式,另一個運算元是整數常量表達式,結果表示式是 if、switch、while、do-while、for 的整個控制表示式。
if(setjmp(env) > 10) { // ...
- 一元 ! 運算子的運算元,結果表示式是 if、switch、while、do-while、for 的整個控制表示式。
while(!setjmp(env)) { // ...
- 表示式語句 的整個表示式(可能轉換為
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
|