gpt4 book ai didi

c++ - MSVC -/EHsc vs/EHa(同步与异步异常处理)

转载 作者:IT老高 更新时间:2023-10-28 12:59:47 31 4
gpt4 key购买 nike

您能否列出实际差异/含义的项目符号列表?我阅读了相关的 MSDN 文章,但我对异步异常的理解仍然有点模糊。

我正在使用 Boost.Test 编写一个测试套件,我的编译器发出一个警告,提示应该启用 EHa:

警告 C4535:调用 _set_se_translator() 需要/EHa

项目本身仅使用普通异常(来自 STL)并且不需要/EHa 开关。我是否必须使用/EHa 开关重新编译它才能使测试套件正常工作?我的感觉是我只需要/EHa 作为测试服。

最佳答案

当您使用/EHsc 时,编译器仅在检测到包装在 try {} block 中的代码可能引发 C++ 异常时,才会发出用于异常过滤器的代码。异常过滤器确保在处理异常时展开堆栈时调用任何本地 C++ 对象的析构函数。它使 RAII 工作。

这是一个优化,x86 代码的空间和时间,x64 代码的空间。空格,因为它可以省略异常过滤器代码,顺便说一句,这是适度的。时间,因为在 x86 上它可以避免在进入 try {} block 时注册异常过滤器。顺便说一句,非常谦虚。 x64 使用不同的方式来查找异常过滤器,它是基于表的。

第一段的关键词是“可能抛出 C++ 异常”。在 Windows 上还有其他异常来源。与/EHa 中的“a”一样,硬件引发的异步异常。诸如浮点异常、被零除和万能的访问冲突异常之类的事情。但也值得注意的是您可能与之交互的代码引发的异常类型。就像托管代码一样,基本上是在 VM 中运行的任何东西。

如果你想让你的对象对这些类型的异常也安全,那么你需要使用/EHa,它告诉编译器总是注册异常过滤器。

当心/EHa 的一个讨厌的副作用,它使 catch(...) 吞下 所有 异常。包括那些你不应该捕获的,比如 AV 和 SO。如果这对您很重要,请查看 __try/__except 和 _set_se_translator()。

关于c++ - MSVC -/EHsc vs/EHa(同步与异步异常处理),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4573536/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com