?
This document uses PHP Chinese website manual Release
在頭文件<setjmp.h>中定義 | ||
---|---|---|
#define setjmp(env)/ *實(shí)現(xiàn)定義的* / |
將當(dāng)前執(zhí)行上下文保存到類型為jmp_buf的變量env中。 此變量稍后可用于通過longjmp函數(shù)恢復(fù)當(dāng)前執(zhí)行上下文。 也就是說,當(dāng)調(diào)用longjmp函數(shù)時(shí),執(zhí)行繼續(xù)在構(gòu)造傳遞給longjmp的jmp_buf變量的特定調(diào)用位置。 在這種情況下,setjmp返回傳遞給longjmp的值。
setjmp的調(diào)用只能出現(xiàn)在下列其中一個(gè)環(huán)境中:
選擇或迭代語句的整個(gè)控制表達(dá)式(if,switch,for,while,do-while)
switch(setjmp(env)) { ..
一個(gè)關(guān)系或相等運(yùn)算符的操作數(shù),另一個(gè)操作數(shù)是一個(gè)整型常量表達(dá)式,結(jié)果表達(dá)式是選擇或迭代語句的整個(gè)控制表達(dá)式
if(setjmp(env) > 10) { ...
一元操作數(shù)!運(yùn)算符的結(jié)果表達(dá)式是選擇或迭代語句的完整控制表達(dá)式
while(!setjmp(env)) { ...
表達(dá)式語句的整個(gè)表達(dá)式(可能轉(zhuǎn)換為void
)。
setjmp(env);
如果setjmp
出現(xiàn)在任何其他上下文中,則行為是未定義的。
返回到setjmp的范圍后,抽象機(jī)器的所有可訪問對象,浮點(diǎn)狀態(tài)標(biāo)志和其他組件都具有與執(zhí)行l(wèi)ongjmp時(shí)相同的值,除了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標(biāo)準(zhǔn)(ISO / IEC 9899:2011):
7.13.1.1 setjmp宏(p:262-263)
C99標(biāo)準(zhǔn)(ISO / IEC 9899:1999):
7.13.1.1 setjmp宏(p:243-244)
C89 / C90標(biāo)準(zhǔn)(ISO / IEC 9899:1990):
4.6.1 setjmp宏
longjmp | 跳轉(zhuǎn)到指定的位置(功能) |
---|
| 用于setjmp的C ++文檔 |