(C)非局部跳转语句(setjmp和longjmp)
2024-10-18 09:34:59
1. 特点
非goto语句在函数内实施跳转,而是在栈上跳过若干调用帧,返回到当前函数调用路径上的某一语句.
头文件包含#include
Void longjmp(jmp_buf env,int val);
返回值:若直接调用则返回0,若从longjmp调用返回则返回非0值
注: setjmp参数evn的类型是一个特殊的类型jmp_buf,这一数据类型是某种形式的数组,其中存放在调用longjmp时能用来恢复栈状态的所有信息.因为需要在另一个函数中引用env变量,所以规范的处理方式是将env变量定义为全局变量。
2.使用方法
在希望返回到的位置调用setjmp, 当检查到一个错误时,则以两个参数调用longjmp函数,第一个就是在调用setjmp时所用的env,第二个参数是具有非0值的val,它将成为从setjmp处返回的值.使用第二个参数的原因是对于一个setjmp可以有多个longjmp。
注:在使用longjmp跳转到setjmp中时,程序主动的退出了!相当于抛出一个异常退出!
使用setjmp和longjmp要注意以下几点:
1. setjmp与longjmp结合使用时,它们必须有严格的先后执行顺序,也即先调用setjmp函数,之后再调用longjmp函数,以恢复到先前被保存的“程序执行点”。
2. 不要假设寄存器类型的变量将总会保持不变.在调用longjmp之后,通过setjmp所返回的控制流中,程序中寄存器类型的变量将不会被恢复。 寄存器类型的变量一般都是临时变量,在C语言中,通过register定义,或直接嵌入汇编代码的程序。
3. longjmp必须在setjmp调用之后,而且longjmp必须在setjmp的作用域之内.
最新文章
- linux中inode、软链接、硬链接
- js-d3画图插件
- 【leetcode】Minimum Size Subarray Sum(middle)
- HM必修3
- 【转】android出现注: 某些输入文件使用或覆盖了已过时的 API。 注: 有关详细信息, 请使用 -Xlint:deprecation 重新编译。 注: 某些输入文件使用了未经检查或不安全的操作。 注
- IOS AFNetworking简介及使用
- Max Sub-matrix
- Spring Ioc知识整理
- C++ 包含头文件 和 宏的使用 和 条件编译
- Windows下让Git记住用户名密码(https)
- Android ListView 单条刷新方法实践及原理解析
- 存储容量和IOPS的关系
- cssie7.0兼容
- nagios系列(七)nagios通过自定义脚本的方式监控mysql主从同步
- python+requests接口自动化完整项目设计源码(一)
- 【WePY小程序框架实战二】-页面结构
- 【搜索】POJ-3009 DFS+回溯
- linux性能系列--cpu
- P4098 [HEOI2013]ALO 可持久化01Trie
- css属性值语法解读