setjmp用法

原文地址

http://blog.csdn.net/wuhong40/article/details/6155838

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 ++可以做到的它基本上也可以...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值