首页 > 代码库 > setjmp和longjmp
setjmp和longjmp
此文是学习 C专家编程 中的笔记。
setjmp和longjmp是C语言所独有的,它们部分弥补了C语言有限的转移能力。
函数说明(来自wiki百科):
int setjmp(jmp_buf env) | 建立本地的jmp_buf 缓冲区并且初始化,用于将来跳转回此处。这个子程序保存程序的调用环境于env 参数所指的缓冲区,env 将被longjmp 使用。如果是从setjmp 直接调用返回,setjmp 返回值为0。如果是从longjmp 恢复的程序调用环境返回,setjmp 返回非零值。 |
void longjmp(jmp_buf env, int value) | 恢复env 所指的缓冲区中的程序调用环境上下文,env 所指缓冲区的内容是由setjmp 子程序调用所保存。value 的值从longjmp 传递给setjmp 。longjmp 完成后,程序从对应的setjmp 调用处继续执行,如同setjmp 调用刚刚完成。如果value 传递给longjmp 零值,setjmp 的返回值为1;否则,setjmp 的返回值为value 。 |
当使用longjmp的时候,j的内容被销毁。
这种方法看起来与goto相似,但是是有区别的,区别如下:
(1)goto语句不能跳出C语言当前的函数。
(2)用longjmp只能跳回曾经到过的地方。在执行setjmp的地方仍留有一个过程活动记录。从这个角度上讲,longjmp更象是“从何处来”,而不是“要往哪去”。另外,longjmp接受一个额外的整形参数并返回它的值,这可以知道是由longjmp转移到这里的还是从上一条语句执行后自然执行到这里的。
示例代码:
1 #include <stdio.h> 2 #include <setjmp.h> 3 4 jmp_buf buf; 5 6 void test_longjmp(void) 7 { 8 printf("test_longjmp() \n"); 9 longjmp(buf, 1);10 printf("end test_longjmp()\n");11 }12 13 void main(void)14 {15 if(setjmp(buf))16 printf("back test_longjmp");17 else18 {19 printf("first time to setjmp \n");20 test_longjmp();21 }22 }
因为,在test_longjmp中执行了longjmp方法,所以该示例中不会执行到“end test_longjmp()”处。
setjmp/longjmp的最大的用途是错误处理,只要还没有从函数中返回,一旦发现一个不可恢复的错误,可以把控制转移到主输入循环,并从那里重新开始执行。
C++中的异常处理机制"catch"和"throw"与其类似。
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。