【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
原创粉丝点击