2011-10-12 189 views
3

我正在处理遗留代码。如果同时指定了EHsc和EHa,会发生什么

要修复一些错误,我必须给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构建的EHa?)

谢谢。

回答

1

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

编译器不知道或关心哪些文件“实际上需要EHa”(直到文件被编译,编译器不能告诉任何有关该文件)。它应用了您告诉它应用的选项。而且你告诉它同时适用,它告诉你它解释这个就好像你想要应用EHA一样。

调用编译器时指定每个矛盾标志而不是的意思是“尝试编译器选项的每种可能的组合,直到找到可用的编译器选项”。

+0

我没有尝试所有可能的组合。我主要担心的是使用EHa可能会降低性能。如果EHa应用于每个源文件,那么我正计划研究一种将EHa应用于实际需要它的文件并用EHsc编译其他文件的方法。唯一的问题是我不熟悉这里使用的基于Visual C++的构建系统。 谢谢 – Niroshan

+0

您可以打开单个文件的属性并为这些特定文件设置不同的标志。但是我希望你在担心可能的性能下降之前,先对它进行了基准测试。过早优化和所有 – jalf

5

/EHa是“更强”的设置。它意味着/ EHsc,但确保即使在引发并捕获非C++异常时也会调用C++析构函数。 Windows中的SEH例外。简单地说,EHsc允许代码生成器优化代码,并在它没有看到括号内的代码抛出C++异常的方式时忽略异常过滤器。这种优化不适用于SEH异常,例如任何语句都可能引发AccessViolation。

当您在程序中使用非标准__try和__except关键字来捕捉SEH异常时,您只需要/ EHa。 AccessViolation,DivisionByZero,浮点异常,与使用SEH作为自身例外的语言运行时交互,等等。如果你使用它们,那么你必须确保全部你的代码是用/ EHa编译的。如果发现SEH异常,则可能导致内存泄漏。

+0

代码使用'set_se_translator()'。而且这个功能只在少数文件上使用。我想用EHa编译使用该功能的文件,并使用更高性能的EHsc。目前的方法是否这样做?谢谢 – Niroshan

+1

MSDN文档非常清晰:'使用_set_se_translator'时必须使用/ EHa。一些文件不算。 32位代码中的异常过滤器开销非常小,而64位代码中则没有。你是微观优化还是你真的*测量*? –

+0

如果开销非常小,我不认为我需要担心它。再次感谢。但我想澄清的事情很少。 根据我的理解,MSDN指的是使用_set_se_translator()的C++文件。那些不使用这个功能的其他文件呢?我觉得应用EHa对他们毫无用处。你能指导我一个很好的url或一本书(我想是时候让我深入研究编译器了) – Niroshan

相关问题