C语言的那些小秘密之异常处理

发表于:2011-12-21 09:45

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:bigloomy(CSDNblog)    来源:51Testing软件测试网采编

  现在我们来分析上边的代码,在main()函数中,我们最初调用setjmp()函数的时候,把当前的环境信息保存在了buf中,函数返回0,然后往下运行,我们输入0。通过if语句发现b的值为0那么就调用error_code()函数来进行处理,在该函数中我们使用了longjmp()函数,其使用方式为longjmp(buf,1);,通过上面的讲解,我们知道第一个参数的作用是用来得到最初调用setjmp()函数是的环境信息,以便在使用longjmp()函数的时候能够正确的返回到setjmp()函数最初的调用处,而后面的参数表示的返回到setjmp()函数的时候的返回值。我们在此返回1,所以执行else部分的语句。

  分析完了上面的代码,读者应该都知道了两个函数的使用方法,值得注意的地方就是我们在setjmp与longjmp结合使用时,它们必须有严格的先后执行顺序,先调用setjmp函数,之后再调用longjmp函数,以恢复到先前被保存的“程序执行点”。否则,假如在setjmp调用之前,执行longjmp函数,将导致程序的执行流变的不可猜测,很轻易导致程序崩溃而退出。为了加深读者的对于两个函数参数的使用,我们看看下面的代码:

  1. #include <stdio.h>   
  2. #include <setjmp.h>   
  3. #include <stdlib.h>   
  4. #include <string.h>   
  5.   
  6. jmp_buf buf;                     
  7.   
  8. void func1()  
  9. {  
  10.     longjmp(buf,1);  
  11. }  
  12.   
  13. void func2()  
  14. {  
  15.     longjmp(buf,2);  
  16. }  
  17.   
  18. void func3()  
  19. {  
  20.     longjmp(buf,3);  
  21. }  
  22.   
  23. int main( void )  
  24. {  
  25.    int value;  
  26.    char str[50];  
  27.   
  28.    value = setjmp( buf );  
  29.    if( value == 0 )  
  30.    {  
  31.         func1();       
  32.    }  
  33.       
  34.     switch( value )  
  35.     {  
  36.         case 1:  
  37.             strcpy( str, "func1 return value" );  
  38.             break;  
  39.         case 2:  
  40.             strcpy( str, "func2 return value" );  
  41.             break;  
  42.         case 3:  
  43.             strcpy( str, "func3 return value" );  
  44.             break;  
  45.         default:  
  46.             strcpy( str, "Other error value" );  
  47.             break;  
  48.     }  
  49.     printf("%s:%d\n",str,value);  
  50.     if(1==value)  
  51.     {  
  52.         func2();  
  53.     }  
  54.     if(2==value)  
  55.     {  
  56.         func3();  
  57.     }  
  58.     return 0;  
  59. }

  运行结果为:

  1. func1 return value:1  
  2. func2 return value:2  
  3. func3 return value:3  
  4. Press any key to continue

  看看运行结果,我们分析下代码,在每个函数中我们调用longjmp()函数,通过设置第二个参数为不同的值来改变setjmp()函数的返回值,然后我们通过判断value值来打印出是那个函数的返回值,我们在此例举这个简单的代码是要大家加深对于这两个函数的参数的使用情况。如果我们在上面的代码中稍作修改,在setjmp()函数的调用之前调用longjmp()函数,我们发现此时没有任何的输出,程序直接崩溃掉退出了。

52/5<12345>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号