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

目录

前言

setjmp宏

longjmp函数

使用方法:

实例:测试setjmp与longjmp的使用


序列文章

<C语言错误处理> <errno.h>头文件与<error.h>头文件:http://t.csdnimg.cn/T1swf

<C语言错误处理> strerror和perror函数以及断言处理方式:http://t.csdnimg.cn/87bt6

<C语言错误处理> <signal.h>头文件及signal函数等内置函数:http://t.csdnimg.cn/RWl4l

<C语言错误处理> 非局部跳转<setjmp.h>头文件:http://t.csdnimg.cn/LpFDZ

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

前言

通常情况下,函数会返回到它被调用的位置,我们无法使用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~

  • 21
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值