`
aigo
  • 浏览: 2698708 次
  • 性别: Icon_minigender_1
  • 来自: 宜昌
社区版块
存档分类
最新评论

EHsc vc EHa (synchronous vs asynchronous exception handling)

 
阅读更多

原文:http://stackoverflow.com/questions/4573536/ehsc-vc-eha-synchronous-vs-asynchronous-exception-handling

 

When you use /EHsc, the compiler will only emit code for exception filters when it can detect that the code wrapped in the try {} block might throw a C++ exception. An exception filter ensures that the destructor of any local C++ objects get called when the stack is unwound while handling an exception. It makes RAII work.

That's an optimization, space and time for x86 code, space for x64 code. Space because it can omit the exception filter code, which is modest btw. Time because on x86 it can avoid registering the exception filter upon entering the try {} block. Very modest btw. x64 uses a different way to find exception filters, it is table-based.

The key phrase in the first paragraph is "might throw a C++ exception". On Windows there are other sources of exceptions. Like the "a" in /EHa, asynchronous exceptions that are raised by the hardware. Things like floating point exceptions, division by zero, and the all-mighty access violation exception. But also notably the kind of exceptions that are raised by code that you might interop with. Like managed code, basically anything that runs in a VM.

When you want to make your objects safe for these kind of exceptions as well then you'll need to use /EHa, that tells the compiler to always register the exception filter.

Beware of a nasty side-effect of /EHa, it makes catch(...) swallow all exceptions. Including the ones you should never catch, like AV and SO. Look at __try/__except and _set_se_translator() if that's important to you.

分享到:
评论

相关推荐

    VC的编译开关

    ### VC的编译开关:/EHsc /EHa /EHc 在Microsoft Visual C++ (VC) 编译器中,异常处理是一个重要的特性,它允许程序员捕获并响应程序执行过程中可能出现的各种错误条件。VC提供了多种不同的异常处理模型来满足不同...

    VC6命令行精简编译器

    **VC6命令行精简编译器详解** Visual C++ 6.0(简称VC6)是微软公司推出的一款经典且强大的C++集成开发环境,它在编程界有着广泛的应用,尤其是在教学和早期软件开发中。尽管后续版本的Visual Studio已经发布,但VC...

    让vc6支持new 抛出异常

    在项目的C/C++属性页中,检查“C++” -> “代码生成” -> “运行时库”是否选择“多线程异常处理 (/EHsc)”。 通过以上步骤,我们就可以在VC6中实现`new`失败时抛出异常的功能,从而增强程序的错误处理能力,使其更...

    VCtoolkit 2003下载及用法

    ### VCtoolkit 2003下载与使用详解 #### 一、简介 VCtoolkit 2003是一款轻量级的C/C++编译工具包,它为开发人员提供了一个无需安装完整Visual Studio环境即可进行C/C++程序开发的选择。这款工具包包含了编译器、...

    VC编译器选项

    **2.10 /EHa:启用异步C++异常处理** - **描述**:启用异步的C++异常处理机制。 - **用途**:处理非同步发生的异常。 **2.11 /Gd:__cdecl调用约定** - **描述**:指定函数的调用约定为__cdecl。 - **用途**:控制...

    VC6.0+SDK+AMD64开发

    【VC6.0+SDK+AMD64开发】是指使用Visual C++ 6.0集成开发环境,结合Windows SDK(Software Development Kit),配置AMD64架构的开发环境,以将原本为32位的程序转化为64位版本。AMD64是AMD公司推出的一种64位扩展...

    vc编译参数

    在深入探讨VC编译参数之前,我们先简要回顾一下Visual C++(简称VC),它是由微软开发的一款功能强大的C++编译器和集成开发环境(IDE)。VC不仅支持标准的C++语言特性,还提供了丰富的库和工具,使得开发者能够高效...

    c++ try catch.doc

    cl /EHsc /EHa source.cpp ``` - 这样做可以告诉编译器不要优化掉`try-catch`块,即使在Release模式下也能确保异常得到妥善处理。 #### 五、`catch(...)`的使用 在C++中,`catch(...)`是一种特殊形式的`catch`...

    一个VC++用来异常处理的演示代码

    catch (std::exception& e) { // 处理std::exception类型的异常 std::cerr << "Caught exception: " << e.what() ; } catch (...) { // 捕获所有其他类型的异常 std::cerr << "Unknown exception caught" ; } ``...

    MFC对话框中编辑框字体大小与颜色的设置(VS2005)

    在VS2005中创建一个新的MFC应用程序,可以选择对话框或文档/视图架构,然后在对话框编辑器中添加编辑框和列表控件,再根据上述方法编写代码实现功能。 总的来说,MFC对话框中编辑框的字体大小和颜色设置涉及CFont类...

    CL_exe的全部命令开关\选项说明

    - `/EHsc`:启用C++异常处理模型,限制异常范围。 3. 链接选项: - `/link <options>`:传递给链接器的选项,如指定库、设置入口点等。 - `/SUBSYSTEM:<value>`:指定可执行文件的子系统,如CONSOLE或WINDOWS。 ...

    浅谈C++ 异常处理的语义和性能

    3. **C++ 加SEH**(/EHa):这种模式同时支持C++异常和Windows的SEH异常,因此可以捕获更多类型的错误,包括系统级别的异常。这会进一步增加代码大小,因为需要处理更多的异常情况,但提高了程序的健壮性。 在讨论...

    河北工业大学操作系统实验

    - 通过“开始” -> “所有程序” -> "Visual Studio 2013" -> "Visual Studio Tools”找到“VS2013开发人员命令提示”,以管理员身份运行。 - 添加`cl`的路径至环境变量`Path`中,如`C:\EEProgram\vsdesktop\VC\...

    vc++编译器链接器选项(231页)

    控制如何处理C++异常,`/EHsc`是最安全的选择,处理标准C++异常。 二、链接器选项 1. `/LIBPATH`:指定额外的库搜索路径。当链接需要的库不在默认路径中时,使用此选项。 2. `/ENTRY`:设置程序入口点。默认是`...

    opencv在vs项目中配置单

    ### OpenCV 在 VS2010 中的配置详解 #### 一、OpenCV 简介 OpenCV(Open Source Computer Vision Library)是一套开源的计算机视觉库,它包含了大量的图像处理与计算机视觉相关的函数,并且能够运行在多种操作系统...

    搜索出现意外错误解决方案

    在Windows XP系统中,用户可能会遇到“搜索出现意外错误”的问题。这通常指的是在尝试使用内置的文件搜索功能时,系统返回一个错误消息,阻碍了正常的搜索操作。这个错误可能是由于多种原因引起的,包括但不限于系统...

    cuda在vs2008上的配置,QT在VS2008上的配置,以及两者在vs2008共同编译环境的配置

    在本文中,我们将详细介绍如何配置CUDA和QT在Visual Studio 2008上的开发环境,以及如何设置两者在VS2008中的共同编译环境。 首先,让我们从CUDA的配置开始: 1. 安装CUDA Toolkit 2.0: - 双击安装文件NVIDIA_...

    HUIUIUIGJI教务管理

    /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /FD /EHsc /RTC1 /MLd /YX"stdafx.h" /Fp".\Debug/topSort.pch" /Fo".\Debug/" /Fd".\Debug/" /W3 /c /ZI /TP .\topSort.cpp ] 正在创建命令行“cl.exe @f:\第...

    vim-power-mode:Vim的电源模式

    Vim电源模式 Vimmers的电源模式 它是如何工作的 用法 :PowerModeOn :PowerModeOff 去做 将在Linux / Unix上工作 安装 克隆项目 ... 在C:/ Windows中制作cl.bat(将12.0更改为VS版本)...cl -EHsc -Feparticle particle.cp

Global site tag (gtag.js) - Google Analytics