longjmp
在头文件<setjmp.h>中定义  |   |   | 
|---|---|---|
void longjmp(jmp_buf env,int status);  |   | (直到C11)  | 
_Noreturn void longjmp(jmp_buf env,int status);  |   | (自C11以来)  | 
将之前调用保存的执行上下文env加载到setjmp。 该功能不返回。 控制权转移到设置env的宏setjmp的调用站点。 那setjmp然后返回作为状态传递的值。
如果调用setjmp的函数已退出(无论是通过返回还是通过堆栈中较高的不同longjmp),则行为是未定义的。 换句话说,只允许长时间跳转调用堆栈。
跨线程跳转(如果调用setjmp的函数由另一个线程执行)也是未定义的行为。  | (自C11以来)  | 
|---|
如果调用setjmp时,VLA或另一个可变修改类型变量处于作用域中,并且控制权留在该作用域内,那么即使控制权保留在该函数内,longjmp也会调用未定义的行为。在堆栈中,longjmp不会释放任何VLA,如果它们的生存期以这种方式终止,则可能会发生内存泄漏:void g(int n){int an; // a可以保持分配h(n); //不返回} void h(int n){int bn; // b可能保持分配longjmp(buf,2); //可能导致h的b和g的内存泄漏a}  | (自C99以来)  | 
|---|
参数
env  | -  | 变量引用由setjmp保存的程序的执行状态  | 
|---|---|---|
status  | -  | 从setjmp返回的值。如果它等于0,则使用1  | 
返回值
(none).
注意
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; // local vars must be volatile for setjmp
    if (setjmp(jump_buffer) != 9)
        a(count++);
}输出:
a(0) called
a(1) called
a(2) called
a(3) called
a(4) called
a(5) called
a(6) called
a(7) called
a(8) called参考
- C11标准(ISO / IEC 9899:2011): 
- 7.13.2.1 longjmp宏(p:263-264)
 
 - C99标准(ISO / IEC 9899:1999): 
- 7.13.2.1 longjmp宏(p:244-245)
 
 - C89 / C90标准(ISO / IEC 9899:1990): 
- 4.6.2.1 longjmp函数
 
 
扩展内容
setjmp  | 保存上下文(功能宏)  | 
|---|
| longjmp的C ++文档 |
本文档系腾讯云开发者社区成员共同维护,如有问题请联系 cloudcommunity@tencent.com

