游戏技术文章

VC编译选项 /EHa 异常处理

时间:2016-12-25 14:39:36  作者:棋牌资源网  来源:棋牌资源网  查看:8974  评论:0
内容摘要: 1 #include 2 void main() 3 { 4 char *a; 5 try 6 { 7 a=0; 8 (*a)=0; 9 }10 catch(...)11 {12 printf("oops,except...

 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

标签:VC编译选项/EHa异常处理 

欢迎加入VIP,【VIP售价:只要288元永久VIP会员】畅享商业棋牌游戏程序下载,点击开通!

下载说明


☉本站所有源码和资源均由站长亲自测试-绝对保证都可以架设,运营!
☉如源码和资源有损坏或所有链接均不能下载,请告知管理员,

☉本站软件和源码大部分为站长独资,资源购买和收集,放心下载!

☉唯一站长QQ:1004003180  [人格担保-本站注重诚信!]

☉购买建议E-mail:1004003180@qq.com   源码收购 E-mail:1004003180@qq.com    

☉本站文件解压密码  【文章内都自带解压密码,每个密码不同!】


本站提供的所有源码,均来源站长提供,仅学习交流 浙ICP备09009969号

由此产生不良后果和法律责任与本站无关,如果侵犯了您的版权,请来信告知 1004003180@qq.com 将及时更正和删除! 

Copyright © 2008-2024 棋牌资源网,你身边的棋牌资源下载站    All Rights Reserved