簡體   English   中英

如果指定了EHsc和EHa會發生什么

[英]What happens if both EHsc and EHa are specified

我正在處理遺留代碼。

為了修復一些bug,我必須給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?)

謝謝。

/ EHa是“更強大”的設置。 它意味着/ EHsc,但確保即使在拋出和捕獲非C ++異常時也會調用C ++析構函數。 Windows中的SEH例外。 Just plain / EHsc允許代碼生成器優化代碼並省略異常過濾器,因為它沒有看到方括號代碼拋出C ++異常的方法。 這種優化不適用於SEH異常,任何語句都可以拋出一個AccessViolation。

當您在程序中使用非標准__try和__except關鍵字來捕獲SEH異常時,您只需要/ EHa。 AccessViolation,DivisionByZero,浮點異常,與使用SEH進行自身異常的語言運行時互操作等。 如果您使用它們,那么您必須確保所有代碼都使用/ EHa編譯。 當捕獲到SEH異常時,出錯會導致內存泄漏。

是的,警告告訴你會發生什么,因為發生的事情可能不是你想要的。 這就是編譯器警告背后的整個想法。

編譯器不知道或關心哪些文件“實際上需要EHa”(在編譯文件之前,編譯器無法告訴文件的任何內容)。 它應用您告訴它應用的選項。 並且你告訴它同時應用它們,並且它告訴你它解釋這就好像你想要應用EHA一樣。

在調用編譯器時指定每個矛盾的標志並不意味着“嘗試每種可能的編譯器選項組合,直到找到一個有效的”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM