如何关闭 Microsoft 编译器 (cl) 中的异常?

How to turn off exceptions in Microsoft compiler(cl)?

我使用什么编译器标志来完全摆脱异常处理? 我根本不使用它们,但编译器仍然会生成 .pdata 和 .xdata 部分,这些部分仅用于异常处理。

在您的项目属性中,将 Enable C++ Exceptions 设置为 No

并通过指定 /EHsc 标志启用展开语义:

要在命令行上设置此选项,您可以省略 [option] 部分中的 /EHa/EHsc/EHs 标志,如 [=17] 中所述=] 手册。 进一步相关的 MSDN 阅读:

这是我的经验。和练习。

要使用 cl.exe 禁用 C++ 异常,应执行以下所有操作:

  • /EHsc 或任何其他 /EH combination,不应作为开关存在,
  • /D_HAS_EXCEPTIONS=0 必须使用
  • /GR- 禁用 RTTI

该组合使 try/throw/catch 成为不存在的关键字。即:您处于非标准 C++ 领域。

cl.exe编译器总是生成支持异步结构化异常处理的代码(SEH)

这意味着 C 或 C++,SEH“永远存在”。我个人确实使用它。 MS STL 编译并且使用上述开关组合非常快。在(几乎所有我的)main() 中,我发现了潜在的 SE,然后我 create a minidump Visual Studio 可以打开并引导您到代码中引发异常的确切位置。

我们需要谈谈 /kernel 开关。它一次性关闭 C++ 异常,并指示链接器生成“内核模式”win 可执行文件、驱动程序等。 /GR-还是要手动使用。我将它用于标准 desktop/console 应用程序,没有任何问题。当然总是使用 SEH。

注意:_CPPUNWIND您不能设置。但是您确实在代码中使用它来检查 C++ 异常是打开还是关闭。

HTH

PS:我总是使用静态运行时库:开关 /MT/MTd。我认为现在不需要做任何其他事情以防使用 dll 运行时,开关:/MD/MDd。我不是 100% 确定,请检查例如here.