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

时间:2017-12-22 19:42:00

标签: c++ visual-c++ cl

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

2 个答案:

答案 0 :(得分:6)

在项目属性中,将启用C ++例外设置为Disable C++ Exceptions

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

要在命令行中设置此选项,您将忽略/EHa部分中的/EHsc/EHs[option]标记,如Compiler Command-Line Syntax中所述手册。 进一步相关的MSDN阅读:

答案 1 :(得分:0)

这是我的经验。并练习。

要使用 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- 仍然需要手动使用。我将它用于标准桌面/控制台应用程序,没有任何问题。当然总是使用 SEH。

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

HTH

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