关闭

setjmp用法

标签: exceptiongcc语言c
3881人阅读 评论(2) 收藏 举报
分类:

 

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

 

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:10414次
    • 积分:143
    • 等级:
    • 排名:千里之外
    • 原创:4篇
    • 转载:0篇
    • 译文:0篇
    • 评论:3条
    文章分类
    最新评论