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