您的位置:首页 > 其它

VC编译选项 /EHa 异常处理

2013-08-08 18:28 274 查看
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的人请一定小心.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: