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

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.lryc.cn/news/247140.html

相关文章:

  • 【SpringCloud】微服务架构设计模式
  • 【EI会议征稿】第三届航空航天工程与系统国际研讨会(ISAES 2024)
  • 唯创知音WT588F02A-16S录音语音芯片在宠物喂食器中的应用:小芯片,大功能
  • SELinux零知识学习三十七、SELinux策略语言之约束(1)
  • sqli-labs靶场详解(less25/25a-less28/28a)
  • 如何优化 Elasticsearch 查询性能
  • 成功的蓝图:实现长期成长与卓越表现的 6 项策略
  • 【JavaEE初阶】认识线程、创建线程
  • uniapp中uni.navigateBack返回后刷新页面数据
  • sed文本 免交互
  • 轻巧高效的剃须好工具,DOCO黑刃电动剃须刀上手
  • 第15关 K8s HPA:自动水平伸缩Pod,实现弹性扩展和资源优化
  • 接口测试工具(Jmeter)必学技巧
  • C++面试,说明const和#define的特点和区别
  • aikit 2023 3D与机械臂结合!
  • 模拟退火算法应用——求解TSP问题
  • 【LeetCode】每日一题 2023_11_28 设计前中后队列(数组/链表/双端队列)
  • python基于YOLOv8全系列模型【n/s/m/l/x】开发构建不同参数量级的钢铁产业产品智能自动化检测识别系统
  • 力扣142. 环形链表 II
  • 【设计模式-2.2】创建型——简单工厂和工厂模式
  • 将文件读入C中的字符数组
  • 不小心删除了短信,如何在 Android 上恢复已删除的短信
  • Java电子招投标采购系统源码-适合于招标代理、政府采购、企业采购、等业务的企业
  • springBoot的实现原理;SpringBoot是什么;使用SpringBoot的核心功能;springBoot核心注解以及核心配置文件
  • logback-spring.xml详解
  • 【Python】nn.BCEWithLogitsLoss函数详解
  • 【C++】日期类的实现
  • 带残差连接的ResNet18
  • 【深入解析git和gdb:版本控制与调试利器的终极指南】
  • CGAN原理讲解与源码