setjmp longjmp
来源:互联网 发布:js点击事件几种写法 编辑:程序博客网 时间:2024/06/10 20:03
setjmp和longjmp是C语言独有的,只有将它们结合起来使用,才能达到程序控制流有效转移的目的,按照程序员的预先设计的意图,去实现对程序中可能出现的异常进行集中处理。
先来看一下这两个函数的定义吧:
setjmp和longjmp的函数原型在setjmp.h中
函数原型:
int setjmp(jmp_buf envbuf);
setjmp函数用缓冲区envbuf保存系统堆栈的内容,以便后续的longjmp函数使用。setjmp函数初次启用时返回0值。
void longjmp(jmp_buf envbuf, int val);
longjmp函数中的参数envbuf是由setjmp函数所保存的堆栈环境,参数val设置setjmp函数的返回值。longjmp函数本身是没有返回值的,它执行后跳转到保存envbuf参数的setjmp函数调用,并由setjmp函数调用返回,此时setjmp函数的返回值就是val。
上面的说明有点拗口,通俗的解释是:先调用setjmp,用变量envbuf记录当前的位置,然后调用longjmp,返回envbuf所记录的位置,并使setjmp的返回值为val。当时用longjmp时,envbuf的内容被销毁了。其实这里的“位置”一词真正的含义是栈定指针。
接着让我们看一个小例子吧:
#include
#include
jmp_buf buf;
banana(){
printf("in banana() \n");
longjmp(buf,1);
printf("you'll never see this,because i longjmp'd");
}
main()
{
if(setjmp(buf))
printf("back in main\n");
else{
printf("first time through\n");
banana();
}
}
(代码段引自《C专家编程》:p)
这段代码的打印结果是:
first time through
in banana()
back in main
仔细看一下应该更能体会这对函数的作用了吧。
setjmp/longjmp的最大用处是错误恢复,类似try ...catch...
他们的功能比goto强多了,goto只能在函数体内跳来跳去,而setjmp/longjmp可以在到过的所有位置间。
从java、.net世界来的兄弟们也许会很不屑于这对函数,也许会觉得这样的功能会使代码的可读性变差。不过请别忘了,这里是C的世界,每个世界有每个世界的哲学,OO只是方法学的一种,而不是全部。quake3是用C写的,据看过其代码的前辈说,其模块化非常好,所以这也是我看quake3代码的初衷。(哦,算了吧,写游戏不是随便说说的...)
- setjmp longjmp
- setjmp()/longjmp()
- setjmp longjmp
- setjmp longjmp
- setjmp longjmp
- setjmp/longjmp
- setjmp/longjmp
- setjmp&longjmp
- setjmp\longjmp
- setjmp longjmp
- setjmp & longjmp
- setjmp&longjmp
- setjmp/longjmp
- setjmp longjmp
- setjmp/longjmp
- setjmp.h setjmp/longjmp
- setjmp()和longjmp()
- setjmp和longjmp函数
- Listener refused the connection with the following error 错误解
- android 实现代码关机
- Mac OS X Lion 进入资源库的方法
- UVA 507 - Jill Rides Again
- 【Win7系统还原让误删文件恢复】
- setjmp longjmp
- 博客第一篇
- 黑马程序员 c#基础流程控制_循环语句
- uva 524
- C 字节对齐
- MFC实现当鼠标移动到button按钮上时是显示一张图片,移开显示另外一张,点击是显示另外一张
- JAVA操作HDFS API(hadoop)
- Android保持屏幕常亮
- 问题解决: 找不到SDL 的头文件 can't open include file : SDL.h