2011-10-12 54 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

相關問題