有人知道如何在MSVC中关闭异常处理选项吗?我试图将“启用C ++异常”选项设置为“否”,我收到警告:
警告C4530:使用了C ++异常处理程序,但未启用展开语义。指定/EHsc
。
我也想关闭异常处理程序,但我不知道如何。
在我的应用程序中,我基本上需要比稳定性更快的速度,因此我选择关闭异常处理。我没有任何try
/ catch
块,但我确实使用STL。当我将“启用C ++异常”选项切换为“否”时,有什么方法可以摆脱这些警告吗?
答案 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
开关。