VC编译选项 /EHa 异常处理


复制代码
 1 #include <stdio.h>
 2 void main()
 3 { 
 4 char *a; 
 5 try 
 6 { 
 7 a=0; 
 8 (*a)=0; 
 9 }
10  catch(...)
11  {
12  printf("oops,exception!!\n");
13  }
14 } 
复制代码


这段代码的运行结果是什么? 
你一定会说 
"屏幕上打出oops,exception!!\n". 
没错,理论上的确是这样. 
我们来验证一下,用vc6产生一个空的win32 console工程, 
加入上面的cpp文件, 
debug方式编译后,得到如期的结果, 
但是! 
release方式编译后,仍然出现了"访问冲突"! 

这如何解释? 
本怪兽经调查发现, 
VC里缺身编译选项里关于异常的选项是/GX, 
文档里说,这等价与/EHs--同步异常捕捉. 
何解? 
答:只有编译器认为有可能出异常的情况下, 
即有throw出现的情况下, 
编译器才会生成异常捕捉代码. 

据说是VC6的一项新优化功能, 
真是自作聪明!谁会希望这样的"异常捕捉"? 

解决方法,去掉/GX,加上/EHa--异步异常捕捉. 
这样可以保证异常捕捉代码不被"高明"的编译器优化掉. 

那为何开头的例子里,debug版本运行正常呢? 
答:debug版本不做优化.故正常也. 

这是VC6 IDE里非常莫名其妙的地方, 
用try catch的人请一定小心.   

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值