【问题标题】:How to turn off exceptions in Microsoft compiler(cl)?如何关闭 Microsoft 编译器(cl)中的异常?
【发布时间】:2017-12-22 19:42:00
【问题描述】:

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

【问题讨论】:

  • IIRC 默认情况下它们是禁用的。
  • @RSahu 我做到了。没有这样的标志。
  • 我根本不使用 NumLock 键,但 PC 制造商仍然将它放在我的键盘上。我怎样才能摆脱它?
  • @Christophe 我 12 岁,所以我想说让你的 uwn 成为标准。可能人们不应该使用这个密钥,真的,你是能够很好地解释它以便标准改变的人。我不使用异常,因为它们甚至不应该存在,就像多重继承、rtti 等一样。我有一个在不久的将来改变行业的计划。
  • @123qwe 开个玩笑,除非您应该考虑混合不同的异常处理代码生成(例如您的代码和您的库的代码)的潜在后果,如下所述:stackoverflow.com/questions/6524259/…

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


【解决方案1】:

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

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

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

【讨论】:

  • @在命令行中而不是在VS中关闭异常的选项是什么?
  • @123qwe 我已经用相关信息更新了答案。
  • 我投了反对票,因为我认为现在我们有一个更可靠的程序和知识库来做到这一点。正如我在下面的回答中所描述的。 2017年Ron无法预测未来,mu downvote不是人身攻击。我认为应该停止匿名投票。
【解决方案2】:

这是我的经验。并练习。

要使用 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.

【讨论】:

  • 感谢您的回答! /EHs-c- /D_HAS_EXCEPTIONS=0 对我有用。
  • 谢谢,@strager :) 也许/EHs-c- 不是必需的。但只要_CPPUNWIND 的行为符合预期就没有关系:)
猜你喜欢
  • 1970-01-01
  • 2016-03-11
  • 1970-01-01
  • 1970-01-01
  • 2019-08-02
  • 2010-11-09
  • 1970-01-01
  • 1970-01-01
  • 2018-05-09
相关资源
最近更新 更多