如何在MSVC中关闭异常处理?

时间:2009-02-16 09:13:05

标签: visual-c++ exception-handling

有人知道如何在MSVC中关闭异常处理选项吗?我试图将“启用C ++异常”选项设置为“否”,我收到警告: 警告C4530:使用了C ++异常处理程序,但未启用展开语义。指定/EHsc

我也想关闭异常处理程序,但我不知道如何。

在我的应用程序中,我基本上需要比稳定性更快的速度,因此我选择关闭异常处理。我没有任何try / catch块,但我确实使用STL。当我将“启用C ++异常”选项切换为“否”时,有什么方法可以摆脱这些警告吗?

7 个答案:

答案 0 :(得分:24)

您很可能包含一个或多个包含try / catch的标准C ++标头。最典型的情况是<iostream> - 你会在一个文件中得到这个错误,该文件只包含一行。任何其他流标题也都可以,区域设置也是如此。

如果仔细查看错误消息,它应该引用两个文件名,而不是一个 - 您的文件,以及包含错误的文件。例如。在#include <iostream>的示例中,我得到了这个:

except.cpp
C:\Program Files\Microsoft Visual Studio 9.0\VC\INCLUDE\xlocale(342) : warning C4530: C++ exception handler used, but unwind semantics are not enabled. Specify /EHsc

答案 1 :(得分:19)

如果您确实不希望STL中的例外链接到您的程序,请在整个项目中定义_HAS_EXCEPTIONS=0。如果您不打算添加异常处理,则优于使用/EHsc编译代码。

答案 2 :(得分:4)

该警告意味着您告诉编译器您不会使用异常,但代码中有try {} catch() {}块。它会通知您,虽然您有该块,但如果抛出异常,则不会执行任何析构函数。关闭异常意味着 - 在异常情况下,当堆栈被展开时,编译器不会生成自动销毁的代码。

答案 3 :(得分:2)

关闭异常非常困难,因为你在这里处理C ++。它实际上与关闭NULL指针属于同一类别 - 例如,你将如何处理内存分配失败?

也就是说,/ EH指定了你想要的异常处理模型,而“none”不是一个选项。您可以选择/ EHa,/ EHs,/ EHac和/ EHsc - [a] ynchronous支持或不支持抛出外部“C”函数。

答案 4 :(得分:1)

在Visual Studio中,/EH位于配置属性➔C/ C ++➔代码生成➔启用C ++异常。

答案 5 :(得分:0)

你的代码中是否还有try / catch块?

遇到问题时要做的第一件事就是在MSDN和/或Google上查找错误。这通常有帮助。这就是MSDN所说的:

  

当未启用/ EHsc选项时,在执行throw的函数和捕获throw的函数之间的框架中具有自动存储的对象将不会被销毁。但是,将破坏在try或catch块中创建的具有自动存储的对象。 [...]

答案 6 :(得分:0)

使用MSVC aka CL可以仅使用/ kernel开关,也可以不使用任何/ EH开关。 Windows C / C ++ MSVC构建始终具有SEH。 SEH是Windows内置的。

如果#if _HAS_EXCEPTIONS == 0,则MS STL会简单地切换到SEH。

那是标准的C ++吗?不它不是。将缺少三个关键字:try,throw和catch。您需要了解SEH。

那是“一件好事”吗?对于Windows低级C ++来说,SEH是一件好事。

ps:不建议在内核开发之外使用/kernel开关。