setjmp用法

原创 2011年01月20日 21:52:00

 

Setjmp.h 所做的事情就是异常处理,抛出异常,捕获异常,异常处理。来看一个简单的例子,除法中除数不能为0。

 

 19 #include <stdio.h>

 20 #include <setjmp.h>

 21 

 22 jmp_buf zero_jmp_buf;

 23 

 24 double division(int a, int b)

 25 {

 26     double result=0.0;

 27     printf("Execute %d/%d .../n", a, b );

 28     if(0 == b)

 29     {

 30         printf("b==0, throw exception /n");

 31         longjmp(zero_jmp_buf, 1);

 32         printf("and here never execute/n");

 33     }

 34 

 35     result=a/b;

 36     printf("The result is %.2f/n", result );

 37     return result;

 38 }

 39 

 40 int main(int argc, char const* argv[])

 41 {

 42     if (0==setjmp(zero_jmp_buf)) {

 43         printf("execute program as normal /n");

 44         division(10,5);

 45         division(10,0);

 46         division(10,8);

 47     }

 48     else 

 49     {

 50         printf("catch a exception, the b is zero /n");

 51     }

 52     return 0;

 53 }

编译和运行 gcc mysetjmp.c

wu@wu-A8Sc:~/workspace/tt2$ ./a.out 

execute program as normal 

Execute 10/5 ...

The result is 2.00

Execute 10/0 ...

b==0, throw exception 

catch a exception, the b is zero 

在22行定义了一个jmp_buf 的全局变量zero_jmp_buf ,他的作用就相对于定义了一个外部标号的集合。函数 division的作用就是除法操作。42     if (0==setjmp(zero_jmp_buf)) 相当于try,第一次运行时setjmp(zero_jmp_buf)始终等于0. 跟它相匹配的else相当于catch, longjmp(zero_jmp_buf, 1);相当于throw , 这样就和c++中的异常处理相对应了。在这里可以用switch.. case..结构来替代if...else ,这样就可以适用于多种情况。例如

switch(setjmp(zero_jmp_buf))

{

 case 0:

//正常运行情况,相对于try

break;

case 1:

//catch,当调用longjmp(zero_jmp_buf, 1);时运行此处代码

break;

case 2:

//catch,当调用longjmp(zero_jmp_buf, 2);时运行此处代码

break;

}

 

case 后的值跟longjmp第二个参数是相对应的。C语言还是很强大的,C ++可以做到的它基本上也可以...

 

相关文章推荐

setjmp与logjmp用法总结

setjmp/logjmp的最大用途是错误恢复,只要还没有从主函数退出,一旦发现一个不可恢复的错误,可以把主控制转移大主函数循环,并从那从新开始。使用时必须包含头文件 setjmp与longjm...
  • maopig
  • maopig
  • 2011年12月21日 23:43
  • 1012

setjmp和longjmp详细介绍

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

setjmp和longjmp函数

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

setjmp和longjmp函数使用详解

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

linux c之<setjmp.h>使用总结

1、爆代码 #include #include #include #include void f1(int, int, int, int); void f2(void); sta...

[转]C标准库中的setjmp与longjmp

在C标准库中有一对非常有趣的函数setjmp()函数与longjmp()函数,用来实现代替goto实现一些非常重要的功能,如异常处理。C语言中,标准库函数setjmp和longjmp形成了结构化异常工...
  • arriod
  • arriod
  • 2012年09月06日 08:05
  • 904

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组合: ...

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

错误处理是任何语言都需要解决的问题,只有不能保证100%的正确运行,就需要有处理错误的机制。异常处理就是其中的一种错误处理方式。 1 过程活动记录(Active Record) C语言中每...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:setjmp用法
举报原因:
原因补充:

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