如果指定了EHsc和EHa会发生什么

时间:2011-10-12 11:14:19

标签: c++ visual-c++ compiler-warnings compiler-options

我正在处理遗留代码。

要修复一些错误,我必须给EHa一些文件。我在测试时测试了整个项目的EHsc和EHa。这解决了我的问题,但发出警告称编译器正在用EHa覆盖EH。 (选项顺序为:/ EHsc / EHa) 仅在构建需要EHa的文件时才会出现此警告。它不会出现在只需要EH的源文件中。

<name of the file that needs EHa>\cl : warning D9025 : overriding '/EHs' with '/EHa'

我的问题是,这个警告是否说明实际发生了什么? EHa仅适用于实际需要EHa的源文件吗? (其他文件是否需要使用EHsc构建EH?)

谢谢。

2 个答案:

答案 0 :(得分:6)

/ EHa是“更强”的设置。它意味着/ EHsc,但确保即使在抛出和捕获非C ++异常时也会调用C ++析构函数。 Windows中的SEH例外。 Just plain / EHsc允许代码生成器优化代码并省略异常过滤器,因为它没有看到方括号代码抛出C ++异常的方法。这种优化不适用于SEH异常,任何语句都可以抛出一个AccessViolation。

当您在程序中使用非标准__try和__except关键字来捕获SEH异常时,您只需要/ EHa。 AccessViolation,DivisionByZero,浮点异常,与使用SEH进行自身异常的语言运行时互操作等。如果您使用它们,那么您必须确保使用/ EHa编译所有代码。当发现SEH异常时,出错会导致内存泄漏。

答案 1 :(得分:1)

是的,警告告诉你会发生什么,因为发生的事情可能不是你想要的。这就是编译器警告背后的整个想法。

编译器不知道或关心哪些文件“实际上需要EHa”(在编译文件之前,编译器无法告诉文件的任何内容)。它应用您告诉它应用的选项。并且你告诉它同时应用它们,并且它告诉你它解释这就好像你想要应用EHA一样。

在调用编译器时指定每个矛盾标志 not 意味着“尝试每种可能的编译器选项组合,直到找到有效的编译器选项”。