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