Setjmp 与longjmp

翻译 2015年07月10日 10:16:53
Setjmp 与longjmp
1.这两个函数是c语言特有的函数
2.setjmp-longjmp组合的用处类似于游戏中的存盘读盘功能,经常被用于类似C++的异常恢复操作。
例子演示:
//int setjmp(jmp_buf envbuf);
//setjmp函数用缓冲区envbuf保存系统堆栈的内容,以便后续的longjmp函数使用.setjmp函数初次启用时返回0值
//void longjmp(jmp_buf envbuf, int val);
//longjmp函数中的参数envbuf是由setjmp函数所保存的堆栈环境,参数val设置setjmp函数的返回值.
//它执行后跳转到保存envbuf参数的setjmp函数调用,并由setjmp函数调用返回,此时setjmp函数的返回值就是val.
#include <setjmp.h>
#include <stdio.h>
#include <stdlib.h>
static jmp_buf buf;
int main(void)
{
    volatile int b = 3;

    if (setjmp(buf) != 0)//函数第一次调用返回0
    {
        printf("%d\n", b);
        exit(0);
    }
    b = 5;
    longjmp(buf, 1);   //第二个参数值1就是setjmp函数的返回值
    printf("i will never be executed!");//这句打印永远不会被执行到
}

void longjmp(jmp_buf envbuf, int val);
总结
setjmp/longjmp的最大用处是错误恢复,类似try ...catch...
他们的功能比goto强多了,goto只能在函数体内跳来跳去,而setjmp/longjmp可以在到过的所有位置处

setjmp和longjmp详细介绍

  • 2009年01月13日 16:07
  • 137KB
  • 下载

setjmp和longjmp函数使用详解

非局部跳转语句---setjmp和longjmp函数。非局部指的是,这不是由普通C语言goto,语句在一个函数内实施的跳转,而是在栈上跳过若干调用帧,返回到当前函数调用路径上的某一个函数中。 #inc...

C语言利用setjmp/longjmp实现模仿C++的层次异常处理机制

传统C语言异常处理机制 传统的C语言异常处理,一般情况下为被调用者通过设置不同的返回值或者设置一个表示错误的全局变量值,以代表执行正常或者是发生了各种各样的错误,异常,警告等等。而调用者则通过被...
  • syzcch
  • syzcch
  • 2012年10月16日 13:38
  • 1782

C语言中利用setjmp和longjmp做异常处理

错误处理是任何语言都需要解决的问题,只有不能保证100%的正确运行,就需要有处理错误的机制。异常处理就是其中的一种错误处理方式。 1 过程活动记录(Active Record) C语言中每...

setjmp和longjmp函数

在C中,goto语句是不能跨越函数的,而执行这类跳转功能的是函数setjmphe lo
  • aganyg
  • aganyg
  • 2014年06月03日 16:07
  • 374

setjmp 和 longjmp 函数

成员函数 int setjmp(jmp_buf env) 创建本地的jmp_buf缓冲区并且初始化,用于将来跳转回此处。这个子程序[1] 保存程序的调用环境于env参数所指的缓冲区,env将被l...

c语言 异常捕捉 setjmp & longjmp

此文是学习 C专家编程 中的笔记。 setjmp和longjmp是C语言所独有的,它们部分弥补了C语言有限的转移能力。 函数说明(来自wiki百科): int setjmp(jmp_...

setjmp与longjmp

关于C语言的语句跳转,在局部范围内(如同一个函数)可以使用goto语句在栈上跳过若干帧,但是goto语句不能进行跨函数调用。如果要想实现跨函数跳转,就必须要使用setjmp和longjmp组合: ...

setjmp longjmp 非局部跳转

http://www.cnblogs.com/lienhua34/archive/2012/04/22/2464859.html
  • Sins_Cj
  • Sins_Cj
  • 2016年01月12日 10:42
  • 283

setjmp和longjmp的使用

int setjmp(jmp_buf envbuf); setjmp函数用缓冲区envbuf保存系统堆栈的内容,以便后续的longjmp函数使用。setjmp函数初次启用时返回0值。 void lo...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Setjmp 与longjmp
举报原因:
原因补充:

(最多只允许输入30个字)