4

私はレガシーコードを扱っています。

いくつかのバグを修正するために、いくつかのファイルに EHa を与える必要があります。ビルド時にプロジェクト全体に EHsc と EHa の両方を与えることをテストしました。これで問題は解決しますが、コンパイラが EH を EHa でオーバーライドしているという警告が表示されます。(オプションの順序: /EHsc /EHa) この警告は、EHa を必要とするファイルがビルドされている場合にのみ発生します。EH のみが必要なソース ファイルには表示されません。

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

私の質問は、この警告は実際に何が起こっているかを示していますか? EHa は実際に EHa を必要とするソース ファイルにのみ適用されますか? (EHa を必要としないその他のファイルは EHsc でビルドされていますか?)

ありがとうございました。

4

2 に答える 2

6

/EHa は「より強い」設定です。/EHsc を意味しますが、C++ 以外の例外がスローされてキャッチされた場合でも、C++ デストラクタが確実に呼び出されるようにします。Windows での SEH 例外。単純な /EHsc を使用すると、コード ジェネレーターはコードを最適化し、角かっこで囲まれたコードが C++ 例外をスローする方法が見つからない場合に例外フィルターを省略できます。この種の最適化は、SEH 例外に対しては機能しません。たとえば、どのステートメントでも AccessViolation をスローできます。

/EHa が必要なのは、プログラムで非標準の __try および __except キーワードを使用して SEH 例外をキャッチする場合のみです。AccessViolation、DivisionByZero、浮動小数点例外、独自の例外に SEH を使用する言語ランタイムとの相互運用性など。それらを使用する場合は、すべてのコードが /EHa でコンパイルされていることを確認する必要があります。これを間違えると、SEH 例外がキャッチされたときにメモリ リークが発生する可能性があります。

于 2011-10-12T11:57:51.707 に答える
1

はい、警告は何が起こるかを教えてくれます。これが、コンパイラの警告の背後にある全体的な考え方です。

コンパイラーは、どのファイルが「実際に EHa を必要とする」かを知りません (ファイルがコンパイルされるまで、コンパイラーはファイルについて何も知ることができません)。適用するように指示したオプションが適用されます。そして、両方を適用するように指示すると、EHA を適用するかのようにこれを解釈することが伝えられます。

コンパイラを呼び出すときに矛盾するすべてのフラグを指定することは、 「機能するオプションが見つかるまで、可能な限りすべてのコンパイラ オプションの組み合わせを試す」という意味ではありません。

于 2011-10-12T11:23:46.870 に答える