当前位置: C语言 -- 标准库 -- <setjmp.h> -- longjmp

longjmp函数


概要:
#include <setjmp.h>
_Noreturn void longjmp(jmp_buf env, int val);

描述:

该函数使用相应的参数env在程序的同一调用中恢复最近一次宏setjmp调用所保存的环境。

如果没有调用宏setjmp,或者如果宏setjmp的调用发生在其它线程中,或者如果包含宏setjmp调用的函数在此期间已经终止执行(例如:通过执行return语句,或者在嵌套调用中其它longjmp函数调用跳转至宏setjmp调用。),或者如果宏setjmp的调用在具有可变修改类型(variably modified type)的标识符的作用域内,并且在此期间程序执行离开了该作用域,上述情况下longjmp函数行为是未定义的。

截至longjmp函数调用时,所有可访问的对象都有值,抽象机的所有其它组件都有状态(这包括但不限于浮点状态标志和打开文件的状态。),除了具有自动存储期限对象的值是不确定的;这些具有自动存储期限的对象是包含对应setjmp宏调用的函数的本地对象,不具有volatile限定类型,并且在宏setjmp调用和函数longjmp调用之间发生了改变。


参数:
jmp_buf env

参数为一个jmp_buf类型的对象,包含最近一次setjmp宏调用环境的相关信息。

int val

对应setjmp宏的返回值。


返回值:

函数无返回值。

该函数调用后,线程继续执行,就好像对应的setjmp宏调用刚刚返回了参数val指定的值。函数longjmp不能使宏setjmp返回0;如果参数val值为0,宏setjmp返回1


范例:
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
31 
32 
33 
34 
35 
/*函数longjmp范例*/

#include <setjmp.h>
#include <stdio.h>
#include <stdlib.h>

jmp_buf environment;

_Noreturn void func(void)
{
    puts("The code before the longjmp function in the func function will be executed.");
    longjmp(environment, 1);

    /*func函数中以下代码不会被执行。*/
    puts("The code after the longjmp function in the func function should never be executed.");
}

int main(void)
{
    if(setjmp(environment))
    {
        puts("The longjmp function has been called.");
        exit(EXIT_FAILURE);
    }

    puts("The setjmp macro has been called.");
    puts("Call the func function.");
    func();

    /*main函数中以下代码不会被执行。*/
    puts("The code after the func function in the main function should never be executed.");

    return 0;
}


输出:

The setjmp macro has been called.

Call the func function.

The code before the longjmp function in the func function will be executed.

The longjmp function has been called.


该程序首先评估if语句的控制表达式setjmp(environment),这次返回值来自宏setjmp的直接调用,所以值为0;接着执行第2627行语句,然后调用func函数;执行longjmp(environment, 1);语句后,程序跳转至main函数的setjmp(environment)处;再次评估控制表达式setjmp(environment),这次返回值来自longjmp(environment, 1)函数调用,所以返回值为1;最后执行第2223行语句。


相关内容:
jmp_buf 保存调用环境相关信息的类型。
setjmp 保存调用环境的宏。