使用 setjmp.h 实现非局部跳转的异常处理

简介: 使用 setjmp.h 实现非局部跳转的异常处理

C语言中的setjmp.h头文件提供了一种非局部跳转的机制,通过 setjmp()longjmp() 函数可以实现一种简单的异常处理方式。这对于需要在程序的不同部分之间进行跳转的情况非常有用,比如处理错误或者清理资源。下面我们将详细介绍setjmp.h头文件中的宏和函数,并提供相应的示例代码。

jmp_buf 类型

jmp_buf 类型是一个数组类型,用于存储 setjmp()longjmp() 相关信息。

库宏

1. setjmp()

setjmp() 宏将当前执行环境保存在 jmp_buf 变量中,以备后续使用。如果 setjmp() 直接从调用中返回,则返回值为 0;但如果是从 longjmp() 函数调用中返回,则返回一个非零值。

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

jmp_buf env;

void foo() {
    int val = setjmp(env);
    if (val == 0) {
        printf("setjmp() returned 0\n");
    } else {
        printf("setjmp() returned non-zero: %d\n", val);
    }
}

int main() {
    foo(); // Output: setjmp() returned 0
    longjmp(env, 1);
    printf("Returned to main()\n"); // This line won't be reached
    return 0;
}

库函数

1. longjmp()

longjmp() 函数恢复最近一次调用 setjmp() 时保存的环境,并跳转到相应的位置。它的第一个参数是 jmp_buf 类型的环境,第二个参数是传递给 setjmp() 的返回值。

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

jmp_buf env;

void foo() {
    int val = setjmp(env);
    if (val == 0) {
        printf("setjmp() returned 0\n");
        longjmp(env, 1);
    } else {
        printf("setjmp() returned non-zero: %d\n", val);
    }
}

int main() {
    foo(); // Output: setjmp() returned 0
    printf("Returned to main()\n");
    return 0;
}


这样,通过 setjmp()longjmp() ,我们可以实现一种简单的异常处理机制,使得程序可以在不同的位置之间进行跳转,而不必遵循正常的函数调用和返回规则。

相关文章
|
6月前
|
搜索推荐 C语言 C++
【C指针(五)】6种转移表实现整合longjmp()/setjmp()函数和qsort函数详解分析&&模拟实现3
【C指针(五)】6种转移表实现整合longjmp()/setjmp()函数和qsort函数详解分析&&模拟实现
|
6月前
|
消息中间件 Kubernetes NoSQL
实现上下文保存和恢复的一种方式--setjmp与longjmp
实现上下文保存和恢复的一种方式--setjmp与longjmp
|
6月前
|
存储
【C指针(五)】6种转移表实现整合longjmp()/setjmp()函数和qsort函数详解分析&&模拟实现2
【C指针(五)】6种转移表实现整合longjmp()/setjmp()函数和qsort函数详解分析&&模拟实现
|
3月前
hyengine 代码块问题之跳转目标地址如何解决
hyengine 代码块问题之跳转目标地址如何解决
|
6月前
|
C语言
【C指针(五)】6种转移表实现整合longjmp()/setjmp()函数和qsort函数详解分析&&模拟实现1
【C指针(五)】6种转移表实现整合longjmp()/setjmp()函数和qsort函数详解分析&&模拟实现
|
3月前
|
运维 Devops
全局异常处理
全局异常处理
36 0
|
6月前
|
搜索推荐 算法
【C指针(五)】6种转移表实现整合longjmp()/setjmp()函数和qsort函数详解分析&&模拟实现4
【C指针(五)】6种转移表实现整合longjmp()/setjmp()函数和qsort函数详解分析&&模拟实现
|
6月前
|
Unix Linux C语言
【C/C++ 跳转函数】setjmp 和 longjmp 函数的巧妙运用: C 语言错误处理实践
【C/C++ 跳转函数】setjmp 和 longjmp 函数的巧妙运用: C 语言错误处理实践
100 0
|
6月前
|
C语言
<C语言错误处理> 非局部跳转<setjmp.h>头文件
<C语言错误处理> 非局部跳转<setjmp.h>头文件