<C语言错误处理> 非局部跳转<setjmp.h>头文件

简介: <C语言错误处理> 非局部跳转<setjmp.h>头文件


<你想看的我这里都有😎 >

前言

通常情况下,函数会返回到它被调用的位置,我们无法使用goto语句改变它的返回的方向,因为goto语句只能跳转到同一函数内的某个标号处,但是<setjmp.h>中包含的setjmp宏与longjmp函数可以使一个函数直接跳转至另一个函数,不需要返回

setjmp宏

原型:int setjmp(jmp_buf env);

作用:在程序中标记一个位置

C标准要求jmp_buf必须是一个数组类型,因此传递给setjmp的实际上是一个指向数组的数组指针

longjmp函数

函数原型:_Noreturn void longjmp(jmp_buf env,int val);

作用:跳转至setjmp宏标记的位置

使用方法:

1、调用set'jmp宏,为跳转标记一个位置(调用参数是一个jmp_buf类型的变量),setjmp会将一个指向自身位置的指针放入该变量中,以便将来longjmp函数的使用,最后返回0

2、longjmp函数根据setjmp提供的jum_buf类型的参数跳转至setjmp宏所在的位置,然后使得setjmp再次返回一个值val(longjmp的第二个参数值)

3、总之,setjmp会在第一次调用时返回0,在后续的调用时返回val(longjmp的第二个参数值)

注意事项:

1、确保longjmp的env参数一定已经被setjmp初始化过

2、包含setjmp最初调用的函数一定不能在调用longjmp之前返回

实例:测试setjmp与longjmp的使用

#include <stdio.h>      
#include <setjmp.h>    
jmp_buf env;
void f1();
void f2();
void f1()
{
    printf("f1 begins\n");
    f2();
    printf("f1 returns\n");
}
void f2()
{
    printf("f2 begins\n");
    longjmp(env,1);
    printf("f2 returns\n");
}
int main()
{
    if (setjmp(env) == 0)
    {
        printf("setjmp returned 0\n");
    }
    else
    {
        printf("Program terminates: longjmp called\n");
        return 0;
    }
    f1();
    printf("Program terminates normally");
    return 0;
}

~over~

相关文章
|
7月前
|
存储 程序员 C语言
C语言错误处理
C语言错误处理
94 0
|
4月前
|
存储 程序员 C语言
C语言的错误处理机制
C语言的错误处理机制
144 0
|
22天前
|
C语言
【C语言】头文件命名详解 - 《铁头无敌 ! 》
头文件在C语言编程中起着组织代码和提高代码复用性的作用。标准头文件提供了丰富的库函数,而自定义头文件可以将常用函数、宏定义、类型定义等封装起来,以便在多个源文件中共享。遵循良好的头文件命名和使用约定,有助于编写清晰、易维护的C语言程序。
63 3
|
26天前
|
C语言
C语言编程中,错误处理至关重要,能提升程序的健壮性和可靠性
C语言编程中,错误处理至关重要,能提升程序的健壮性和可靠性。本文探讨了C语言中的错误类型(如语法错误、运行时错误)、基本处理方法(如返回值、全局变量、自定义异常处理)、常见策略(如检查返回值、设置标志位、记录错误信息)及错误处理函数(如perror、strerror)。强调了不忽略错误、保持处理一致性及避免过度处理的重要性,并通过文件操作和网络编程实例展示了错误处理的应用。
57 4
|
4月前
|
C语言
【C语言小知识】备选拼写:iso646.h头文件
【C语言小知识】备选拼写:iso646.h头文件
|
7月前
|
C语言
C语言中的跳转语句
C语言中的跳转语句
153 1
|
7月前
|
C语言
【C 言专栏】C 语言中的错误处理机制
【5月更文挑战第3天】本文探讨了C语言中的错误处理机制,涵盖错误类型(语法和运行时错误)、基本处理方法(返回值、全局变量和自定义异常)及常见策略(检查返回值、设置标志位和记录错误信息)。还介绍了perror和strerror函数,并强调自定义错误处理函数的重要性。注意不要忽略错误,保持处理一致性,避免过度处理。通过实例说明错误处理在文件操作和网络编程中的关键作用。错误处理是提升程序稳定性和可靠性的必备技能,需要在实践中不断学习和完善。
187 4
|
7月前
|
编译器 API C语言
C语言头文件
C语言头文件
117 0
|
7月前
|
Unix Linux C语言
【C/C++ 跳转函数】setjmp 和 longjmp 函数的巧妙运用: C 语言错误处理实践
【C/C++ 跳转函数】setjmp 和 longjmp 函数的巧妙运用: C 语言错误处理实践
117 0
|
7月前
|
编译器 C语言
C语言基础专题 - 头文件引用
C语言基础专题 - 头文件引用
158 0