【C】初学习之错误处理——非局部跳转<setjmp.h>
来源:互联网 发布:三菱plcfx3u编程软件 编辑:程序博客网 时间:2024/05/16 07:48
通常情况,不使用goto语句的情况下,函数会返回到他被调用的位置。但是使用<setjmp.h>可以使一个函数直接跳转到另一函数,不需要返回。
<setjmp.h>中最重要的内容是 setjmp宏和longjmp函数。—— setjmp宏“标记”程序的一个位置;longjmp函数可以跳转到之前所标记的位置。
该强大的机制主要运用在错误处理之中。
(1)调用setjmp宏的参数是一个jmp_buf(在<setjmp.h>中声明)类型的变量。setjmp宏会将当前的 环境 保存到该变量以便longjmp函数调用时使用,然后返回0。
调用格式: int setjmp(jmp_buf env);
(2)调用longjmp函数的参数是和setjmp使用同一jup_buf类型的变量(用该变量内容来恢复当前环境)然后从setjmp宏调用中返回值val(longjmp函数的第二个参数)。
调用格式: void longjmp(jmp_buf env,int val);
总而言之,setjmp在第一次调用时返回0,随后longjmp函数调用后将控制权重新转给setjmp宏,这次调用的
setjmp会返回一个非零值。
看书上一个例子:
//测试setjmp的longjmp#include#include jmp_buf env;void f1(void);void f2(void);int main(void) {if (setjmp(env) == 0)printf("setjmp returned 0\n");else {printf("Program terminates: longjmp called\n");getch();return 0;}f1();printf("Program terminates normally\n");getch();return 0;}void f1(void) {printf("f1 begins\n");f2();printf("f1 returns\n");}void f2(void) {printf("f2 begins\n");longjmp(env, 1);printf("f2 returns\n");}
结果如图所示:
可知,setjmp宏最初返回0,main会调用f1,接着f1调用f2,f2使用longjmp将控制权重新转给main函数,而不是返回
到f1.当longjmp函数执行时,控制权重新回到setjmp宏调用,这一次setjmp宏返回1。
阅读全文
1 0
- 【C】初学习之错误处理——非局部跳转<setjmp.h>
- C标准库学习之<setjmp.h> ——非局部跳转
- 非局部跳转 setjmp
- <setjmp.h>非局部跳转(来自C语言程序设计--现代方法第二版)
- C语言学习:非局部跳转setjmp.h中的几个重要函数
- setjmp longjmp 非局部跳转
- 浅析C语言的非局部跳转:setjmp和longjmp
- (C)非局部跳转语句(setjmp和longjmp)
- C语言的非局部跳转:setjmp和longjmp
- 浅析C语言的非局部跳转:setjmp和longjmp
- 浅析C语言的非局部跳转:setjmp和longjmp
- 浅析C语言的非局部跳转:setjmp和longjmp
- Linux C 异常处理:非局部goto jmp_buf/setjmp()/longjmp()
- 非局部跳转函数 setjmp 和 longjmp
- 非局部跳转函数 setjmp 和 longjmp .
- setjmp/longjmp非局部跳转函数分析
- 【setjmp和longjmp 】 C语言的非局部跳转:setjmp和longjmp(跨函数长跳转)
- C89标准库头文件——非本地跳转<setjmp.h>的应用
- STM32晶振8M改12M方法
- Qt 5.9.1 在Windows下部署小工具、企业级应用总结
- pycharm破解方法
- 自己记录四舍五入,并且格式化
- 七、输入/输出流--基于字符串的流---streambuf类
- 【C】初学习之错误处理——非局部跳转<setjmp.h>
- BLDC无刷电机在离心机上面的应用
- 基于Android DataBinding的BindingAdapter实现密码字符*的回显
- tomcat启动出错排查
- Redis报错——MISCONF Redis is configured to save RDB snapshots
- Java并发编程:volatile关键字解析
- soj1087_贪心
- JS延迟加载的方式
- Java:对象克隆(Clone)及Cloneable接口、Serializable接口详解