rainbowzc

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: :: :: 管理 ::
 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的人请一定小心.  
------------------------------------------------------------------------------------------------------------

在【属性】-》【C/C++】-》【代码生成】-》【启用C++异常】有如下4个选项,点击组合框,显示:


是(/EHsc)
是,但有 SEH 异常(/EHa)
<从父级或项目默认设置继承>

1、如果不选择【是,但有 SEH 异常(/EHa)】选项,try { } catch(...) {} 不起作用。新建项目缺省值是【是(/EHsc)】。就是说在缺省情况下微软不支持标准C++。

2、微软自己又弄出:__try { } __except(EXCEPTION_EXECUTE_HANDLER) { }。【启用C++异常】选项对此不起作用,选什么都起作用。建议不要使用。还是使用标准的吧。

3、微软还弄出:TRY{} CATCH_ALL(e) {} END_CATCH_ALL不知为什么还弄。可能微软的开发人员那天还得弄。

总结:掌握第1种方法就足够了,其实也不应该出现其他方法。如果你的是在从API封装类,建议还是用第2种方法,可能你的类要应用到很多项目,那个项目是否选择了【是,但有 SEH 异常(/EHa)】就很难说了,可能那个程序员根本就没有注意到【是,但有 SEH 异常(/EHa)】选项,使用第1种方法会使你的异常失效。但我又觉得__try { }实在不是个东西,看着别扭。

-------------------------------------------------------------------------------------------------------------

VC编译优化设置0
VC- Project Setting-Debug-Project Option语法解释

-优化-

/O1 最小化空间 minimize space

/Op[-] 改善浮点数一致性 improve floating-pt consistency

/O2 最大化速度 maximize speed

/Os 优选代码空间 favor code space

/Oa 假设没有别名 assume no aliasing

/Ot 优选代码速度 favor code speed

/Ob 内联展开(默认 n=0) inline expansion (default n=0)

/Ow 假设交叉函数别名 assume cross-function aliasing

/Od 禁用优化(默认值) disable optimizations (default)

/Ox 最大化选项。(/Ogityb2 /Gs) maximum opts. (/Ogityb1 /Gs)

/Og 启用全局优化 enable global optimization

/Oy[-] 启用框架指针省略 enable frame pointer omission

/Oi 启用内建函数 enable intrinsic functions

-代码生成-

/G3 为 80386 进行优化 optimize for 80386

/G4 为 80486 进行优化 optimize for 80486

/GR[-] 启用 C++ RTTI enable C++ RTTI

/G5 为 Pentium 进行优化 optimize for Pentium

/G6 为 Pentium Pro 进行优化 optimize for Pentium Pro

/GX[-] 启用 C++ 异常处理(与 /EHsc 相同) enable C++ EH (same as /EHsc)

/EHs 启用同步 C++ 异常处理 enable synchronous C++ EH

/GD 为 Windows DLL 进行优化 optimize for Windows DLL

/GB 为混合模型进行优化(默认) optimize for blended model (default)

/EHa 启用异步 C++ 异常处理 enable asynchronous C++ EH

/Gd __cdecl 调用约定 __cdecl calling convention

/EHc extern“C”默认为 nothrow extern "C" defaults to nothrow

/Gr __fastcall 调用约定 __fastcall calling convention

/Gi[-] 启用增量编译 enable incremental compilation

/Gz __stdcall 调用约定 __stdcall calling convention

/Gm[-] 启用最小重新生成 enable minimal rebuild

/GA 为 Windows 应用程序进行优化 optimize for Windows Application

/Gf 启用字符串池 enable string pooling

/QIfdiv[-] 启用 Pentium FDIV 修复 enable Pentium FDIV fix

/GF 启用只读字符串池 enable read-only string pooling

posted on 2013-02-26 10:48  ct  阅读(6182)  评论(0编辑  收藏  举报