zoukankan      html  css  js  c++  java
  • 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的人请一定小心.  
    ------------------------------------------------------------------------------------------------------------

    在【属性】-》【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

  • 相关阅读:
    python while循环语句 结合 if else pass temp语句求触发的余数 的练习题
    IF函数多个条件判断及嵌套
    Python 字符串 加减乘除
    Python条件语句 -- if ,else ( 如果 ,那么)
    input 变量名命名规则
    Python解释器的头部编码用途
    switch留个爪,之后还需要再研究下
    面向对象+JAVA基础
    爱因斯坦台阶
    成功的拆开了SELECT里JOIN个SELECT是啥
  • 原文地址:https://www.cnblogs.com/rainbowzc/p/2933137.html
Copyright © 2011-2022 走看看