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

jmp_buf类型


描述:

该类型是一种数组类型,适合保存恢复调用环境所需的信息。调用宏setjmp的环境应包含足够信息,以便调用longjmp函数将执行返回到正确的块,并调用该块(如果以递归方式调用。)。它不包括浮点状态标志、打开的文件或者抽象机的任何其它组件的状态。


GCC编译器中,该类型定义如下:

#define _JBLEN 16

#define _JBTYPE int

typedef _JBTYPE jmp_buf[_JBLEN];


范例:
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 
/*类型jmp_buf范例*/

#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行语句。


相关内容:
setjmp 保存调用环境的宏。
longjmp 恢复调用环境的函数。