?
This document uses PHP Chinese website manual Release
在頭文件<setjmp.h>中定義 | ||
---|---|---|
void longjmp(jmp_buf env,int status); | (直到C11) | |
_Noreturn void longjmp(jmp_buf env,int status); | (自C11以來) |
將之前調(diào)用保存的執(zhí)行上下文env加載到setjmp。 該功能不返回。 控制權(quán)轉(zhuǎn)移到設(shè)置env的宏setjmp的調(diào)用站點。 那setjmp然后返回作為狀態(tài)傳遞的值。
如果調(diào)用setjmp的函數(shù)已退出(無論是通過返回還是通過堆棧中較高的不同longjmp),則行為是未定義的。 換句話說,只允許長時間跳轉(zhuǎn)調(diào)用堆棧。
跨線程跳轉(zhuǎn)(如果調(diào)用setjmp的函數(shù)由另一個線程執(zhí)行)也是未定義的行為。 | (自C11以來) |
---|
如果調(diào)用setjmp時,VLA或另一個可變修改類型變量處于作用域中,并且控制權(quán)留在該作用域內(nèi),那么即使控制權(quán)保留在該函數(shù)內(nèi),longjmp也會調(diào)用未定義的行為。在堆棧中,longjmp不會釋放任何VLA,如果它們的生存期以這種方式終止,則可能會發(fā)生內(nèi)存泄漏:void g(int n){int an; // a可以保持分配h(n); //不返回} void h(int n){int bn; // b可能保持分配longjmp(buf,2); //可能導(dǎo)致h的b和g的內(nèi)存泄漏a} | (自C99以來) |
---|
env | - | 變量引用由setjmp保存的程序的執(zhí)行狀態(tài) |
---|---|---|
status | - | 從setjmp返回的值。如果它等于0,則使用1 |
(none).
longjmp
用于處理函數(shù)無法有效返回的意外錯誤條件。這與其他編程語言中的異常處理類似。
#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; // local vars must be volatile for setjmp if (setjmp(jump_buffer) != 9) a(count++);}
輸出:
a(0) calleda(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.2.1 longjmp宏(p:263-264)
C99標(biāo)準(zhǔn)(ISO / IEC 9899:1999):
7.13.2.1 longjmp宏(p:244-245)
C89 / C90標(biāo)準(zhǔn)(ISO / IEC 9899:1990):
4.6.2.1 longjmp函數(shù)
setjmp | 保存上下文(功能宏) |
---|
| longjmp的C ++文檔 |