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

Visual c++ 如何在MSVC中关闭异常处理?,visual-c++,exception-handling,Visual C++,Exception Handling,有人知道如何关闭MSVC中的异常处理选项吗?我尝试设置“启用C++异常”选项,我得到警告: 警告C45 30:C++异常处理程序,但未启用展开语义。指定/EHsc 我也想关闭异常处理程序,但我不知道如何关闭 在我的应用程序中,我基本上需要的是速度而不是稳定性,因此我选择关闭异常处理。我没有任何try/catch块,但我使用STL。当我将“启用C++异常”选项转换为“否”时,有没有办法消除这些警告? < p>您的代码中仍然有尝试/ catch块吗? 当你陷入困境时,首先要做的是在MSDN和/或谷歌

有人知道如何关闭MSVC中的异常处理选项吗?我尝试设置“启用C++异常”选项,我得到警告: 警告C45 30:C++异常处理程序,但未启用展开语义。指定
/EHsc

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


在我的应用程序中,我基本上需要的是速度而不是稳定性,因此我选择关闭异常处理。我没有任何
try
/
catch
块,但我使用STL。当我将“启用C++异常”选项转换为“否”时,有没有办法消除这些警告?

< p>您的代码中仍然有尝试/ catch块吗? 当你陷入困境时,首先要做的是在MSDN和/或谷歌上查找错误。这通常会有帮助。MSDN就是这么说的:

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


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


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

该警告意味着您告诉编译器您不会使用异常,但代码中有一个
try{}catch(){}
块。它会通知您,尽管您拥有该块,但如果抛出异常,则不会执行任何Destructor。关闭异常意味着编译器在异常情况下堆栈解开时不会产生自动销毁代码。

最有可能的是包含一个或多个包含TI/catch的标准C++标题。最典型的情况是

——您将在一个文件中看到此错误,该文件只包含一行。任何其他流头也会这样做,区域设置也是如此

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

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

如果您确实不希望STL中的异常链接到您的程序,请在整个项目中定义
\u HAS\u exceptions=0
。如果您不打算添加异常处理,那么使用
/EHsc
编译代码比使用
/EHsc
更好。

在Visual Studio中,可以在配置属性中找到
/EH
➔ C/C++➔ 代码生成➔ 启用C++异常。

< P>使用MSVC AKA CL,可以简单地使用/NEAR交换机或不具有任何/EH交换机。Windows C/C++MSVC版本始终具有。SEH内置于Windows中

如果
#如果_有_异常==0
,MS STL将简单地切换到SEH

是标准C++吗?不,不是。将缺少三个关键词:尝试、投掷和接球。你需要了解SEH

那么这是一件“好事”吗?对于Windows低级别C++,SEH是个好东西。
ps:在内核开发之外,不建议使用
/kernel
开关。

好吧,我搜索了代码,但是那里没有任何try/catch块。然而,我使用“new”创建了一些类,它也适用于此吗?不适用。这是一个编译器警告,在编译单个cpp文件时出现。文件名显示在警告之前。这就是包含违规代码的文件。最坏的情况下,你可以尝试选择注释文件的部分来查看警告的原因。作为一个补充,我必须补充一下,没有任何例外的ANSI/ISO C++是不存在的。语言规范甚至不考虑“禁用”它们,整个标准库(包括STL)使用异常。即使容器也使用它们,例如std::vector::at()嗯,我不同意这种说法。难道C++没有承诺在你不想要的任何特性(例外,RTTI)??迪迪托:理论是,如果你不使用它们,你就不会为它们付费。这就是为什么没有标准选项来关闭它们:标准要求它们在未使用时是免费的,因此关闭它们永远不会有任何好处。(实现这一点的典型方法是表驱动机制,在抛出异常时加载需求。)这是一个troll答案。我不使用异常,您可以关闭它们。您也不会被迫使用STL。它不是语言的一部分。define\u有\u异常0使我的exe变大4KB启用异常使它又变大4KB。禁用设置和_有_异常0将删除警告并保持exe更小。是的,这是我首先发现的,我不知道我做错了什么,因为我还没有正确理解这三个句子的词汇表。有人能解释这个警告没有RTFM吗?编辑:这个网站解释了MS-C++-Compiler CL的/EHx参数,并提供了一个更好的线索:禁用异常处理在性能方面不会给你带来太多好处。在x86中设置异常帧很便宜。与x64例外情况是真正的零开销;没有为非抛出代码路径添加任何代码。您可能会从编译器提供的更好的优化选项或更小的二进制大小中获益,但无论哪种方式,您都希望改进是微不足道的。