c++ - 如果同时指定 EHsc 和 EHa 会发生什么

标签 c++ visual-c++ compiler-warnings compiler-options

我正在处理遗留代码。

为了修复一些错误,我必须为某些文件提供 EHa。我测试了在构建时将 EHsc 和 EHa 都赋予整个项目。这解决了我的问题,但给出警告说编译器正在用 EHa 覆盖 EH。 (选项顺序为:/EHsc/EHa) 只有在构建需要 EHa 的文件时才会出现此警告。它不会出现在只需要 EH 的源文件上。

<name of the file that needs EHa>\cl : warning D9025 : overriding '/EHs' with '/EHa'

我的问题是,这个警告是否说明实际发生了什么? EHa 是否仅应用于实际需要 EHa 的源文件? (其他不需要EHa的文件是用EHsc建的吗?)

谢谢。

最佳答案

/EHa 是“更强”的设置。它暗示/EHsc 但确保即使在抛出和捕获非 C++ 异常时也会调用 C++ 析构函数。 Windows 中的 SEH 异常。只是简单的/EHsc 允许代码生成器优化代码并在它看不到括号代码抛出 C++ 异常的方式时省略异常过滤器。这种优化不适用于 SEH 异常,例如任何语句都可能抛出 AccessViolation。

当您在程序中使用非标准的 __try 和 __except 关键字捕获 SEH 异常时,您只需要/EHa。 AccessViolation、DivisionByZero、浮点异常、与使用 SEH 处理自身异常的语言运行时互操作等。如果您使用它们,那么您必须确保所有 您的代码都是使用/EHa 编译的。当捕获到 SEH 异常时,弄错可能会导致内存泄漏。

关于c++ - 如果同时指定 EHsc 和 EHa 会发生什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7739189/

上一篇:C++转义码参数

下一篇:c++ - 类中的typedef

相关文章:

java - 未设置引导类路径

java - 为什么编译器会在多行中输出单个警告?

c++ - 有人曾经将 boost::singleton 与 boost::logger 一起使用过吗?

debugging - 是否有任何编译器选项可以使 x64 版本崩溃转储更有用?

c++ - 是否有任何 c/c++ 编译器可以警告(或给出错误)或枚举转换为 int?

c++ - 在std::wstring上使用std::remove_if的警告(MSVC C++ 20)

c++ - 在 Visual Studio C++ 中执行简单 SQL 查询时出错

c++ - 模板案例的编译器警告,模板特化应涵盖

c++段错误试图访问 vector

c++ - 拒绝访问试图打开进程