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传递给setjmplongjmp完成后,程序从对应的setjmp调用处继续执行,如同setjmp调用刚刚完成。如果value传递给longjmp零值,setjmp的返回值为1;否则,setjmp的返回值为value

当使用longjmp的时候,j的内容被销毁


/*
 * 3.c
 *
 *  Created on: 2015年3月1日
 *      Author: zengshunyao
 */

#include <stdio.h>
#include <setjmp.h>

jmp_buf buf;

void banana(void)
{
  printf("banana() \n");
  longjmp(buf, 1);
  printf("end banana()\n");
}

void main(void)
{
   if(setjmp(buf))
     printf("back banana");
   else
     {
       printf("first time to setjmp \n");
       banana();
     }
}



因为,在banana中执行了longjmp方法,所以该示例中不会执行到“end banana()”处。

setjmp/longjmp的最大的用途是错误处理,只要还没有从函数中返回,一旦发现一个不可恢复的错误,可以把控制转移到主输入循环,并从那里重新开始执行。

C++中的异常处理机制"catch"和"throw"与其类似。


猜你喜欢

转载自blog.csdn.net/zengshunyao/article/details/44006661
今日推荐