?
本文檔使用 PHP中文網(wǎng)手冊 發(fā)布
在頭文件<setjmp.h>中定義 | ||
---|---|---|
#define setjmp(env)/ *實現(xiàn)定義的* / |
將當前執(zhí)行上下文保存到類型為jmp_buf的變量env中。 此變量稍后可用于通過longjmp函數(shù)恢復當前執(zhí)行上下文。 也就是說,當調(diào)用longjmp函數(shù)時,執(zhí)行繼續(xù)在構(gòu)造傳遞給longjmp的jmp_buf變量的特定調(diào)用位置。 在這種情況下,setjmp返回傳遞給longjmp的值。
setjmp的調(diào)用只能出現(xiàn)在下列其中一個環(huán)境中:
選擇或迭代語句的整個控制表達式(if,switch,for,while,do-while)
switch(setjmp(env)) { ..
一個關系或相等運算符的操作數(shù),另一個操作數(shù)是一個整型常量表達式,結(jié)果表達式是選擇或迭代語句的整個控制表達式
if(setjmp(env) > 10) { ...
一元操作數(shù)!運算符的結(jié)果表達式是選擇或迭代語句的完整控制表達式
while(!setjmp(env)) { ...
表達式語句的整個表達式(可能轉(zhuǎn)換為void
)。
setjmp(env);
如果setjmp
出現(xiàn)在任何其他上下文中,則行為是未定義的。
返回到setjmp的范圍后,抽象機器的所有可訪問對象,浮點狀態(tài)標志和其他組件都具有與執(zhí)行l(wèi)ongjmp時相同的值,除了setjmp作用域中的非易失性局部變量如果自從setjmp調(diào)用以來它們已被更改,則值是不確定的。
env | - | 變量來保存程序的執(zhí)行狀態(tài)。 |
---|
如果宏由原始代碼調(diào)用并且執(zhí)行上下文已保存到env,則返回0。
如果非本地跳轉(zhuǎn)剛剛執(zhí)行,則返回的是非0值。 返回值與傳遞給longjmp的返回值相同。
#include <stdio.h>#include <setjmp.h>#include <stdnoreturn.h> jmp_buf jump_buffer; noreturn void a(int count) { printf("a(%d) called\n", count); longjmp(jump_buffer, count+1); // will return count+1 out of setjmp} int main(void){ volatile int count = 0; // modified local vars in setjmp scope must be volatile if (setjmp(jump_buffer) != 9) // compare against constant in an if a(++count);}
輸出:
a(1) calleda(2) calleda(3) calleda(4) calleda(5) calleda(6) calleda(7) calleda(8) called
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宏
longjmp | 跳轉(zhuǎn)到指定的位置(功能) |
---|
| 用于setjmp的C ++文檔 |