当前位置: 首页 > article >正文

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

目录

前言

setjmp宏

longjmp函数

使用方法:

实例:测试setjmp与longjmp的使用


前言

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


http://www.kler.cn/news/148361.html

相关文章:

  • python 爬虫之 爬取网站信息并保存到文件
  • C++初阶--String类的使用
  • TCP 传输可靠性问题
  • DMX512协议及对接口电路的分析
  • openssl版本号解析
  • HTML新手入门笔记整理:HTML基本标签
  • 【DevOps】SonarQube 指标解读
  • Vue3 实现elementPlus的table列宽调整和拖拽
  • 最新版灵沐V3.3微信资源类小程序源码支持流量主
  • C语言面试之旅:掌握基础,探索深度(面试实战之c语言关键词中篇)
  • 在Spring Boot中使用ECharts绘制数据图表
  • 智慧化工~工厂设备检修和保全信息化智能化机制流程
  • 火狐挂代理访问问题Software is preventing Firefox from safely connecting to this site
  • Blazor Table 实现获取当前选中行的功能
  • pdf加密文件解密(pdf文件解密小工具)
  • Kotlin学习——kt里面的函数,高阶函数 函数式编程 扩展函数和属性
  • 神器!使用 patchworklib 库进行多图排版真棒啊
  • Dubbo相关的问题
  • 前端开发学习 (三) 列表功能
  • 【开源】基于JAVA的森林火灾预警系统
  • C++进阶篇5---番外-位图和布隆过滤器
  • 带着GPT-4V(ision)上路,自动驾驶新探索
  • 计算虚拟化之CPU——qemu解析
  • 距离向量路由协议——IGRP和EIGRP
  • Modown主题v8.12 安装教程和主题下载
  • 促进高层次人才创新创业,长沙又在“放大招”
  • uniapp使用map标签
  • 淼一科技为互联网企业销毁硬盘数据 拆除机房设备
  • Hive进阶函数:inline() 和 struct() ,一列转多行
  • git stash