1

アプリケーションで奇妙な状況が発生したようです。_DEBUG が定義されている場合にのみ実行されるはずの ASSERT がトリガーされていますが、アプリケーションがリリース モードでコンパイルされているときに評価されています。

ASSERT はヘッダー ファイルで定義されており、ソース ファイルに含まれている別のヘッダー ファイルからトリガーされています。

さらに調べてみると、ソース ファイルは実際にリリース モードで実行されています (_DEBUG は定義されておらず、NDEBUG は定義されています)。ただし、ヘッダー ファイルには、NDEBUG ではなく、_DEBUG が定義されています。

一般的な通念によれば、ヘッダー ファイルを #include することは、コード行をソース ファイルにカット アンド ペーストすることと同じです。これにより、上記の動作が不可能になります。

VS2010 で大規模な混合言語 (Intel FORTRAN および C++) アプリケーションをコンパイルしています。ただし、この問題はビルド サーバーでも発生するため、単なる VS2010 の「機能」ではないようです。

私たちはチェックしました:

  1. すべてのプロジェクトはリリースで構築されています。
  2. 影響を受ける cpp ファイルには、異常なプロパティが設定されていません。
  3. このソリューションには、_DEBUG または NDEBUG を手動で定義または定義解除するファイルはありません。
  4. 次のような句を含めることにより、上記の動作を確立しました。

bool is_debug = false;

#ifdef _DEBUG

is_debug = true

#endif

そしてその直後にポイントを破る。

テストするものが不足しています - 私が仮説を立てることができる唯一のものは次のとおりです。

  1. 一部の標準ライブラリまたは外部インクルードが _DEGUG および NDEBUG を再定義している、または
  2. 何かが #include マクロをオーバーライドしました (これは可能ですか?)。

編集 - - - - - - - - - - - - - - - - - - - - - - - - - ----------

#error トリック (下記) のおかげもあって、差し迫った問題が見つかりました。いくつかのプロジェクトでは、NDEBUG と _DEBUG が定義されていません。これらのプロジェクトはすべて、マクロ $(PreprocessorDefinitions) から何かを継承することを意図していましたが、これはどこにも定義されていません。

これはまだいくつかの厄介な質問を残します:

  1. 上記の動作を引き起こしたソース ファイルには、プロジェクト設定で NDEBUG が定義されていますが、含まれているヘッダー ファイルには含まれていません (ただし、VS2010 では正しい #ifdef ブロックがグレー表示されます)
  2. PreprocessorDefinitions マクロがすべての C++ プロジェクトに継承されている場合 (継承されているようです)、どこにも定義されていないのはなぜですか?
4

3 に答える 3

0

OK、問題は、NDEBUG と _DEBUG がいくつかのプロジェクトの [プロパティ] -> [C/C++] -> [プリプロセッサ] -> [プリプロセッサ定義] にないためであることが判明しました。それらが常に欠落していたのか、それとも元々 $(PreprocessorDefinitions) マクロを介して含まれていたのかは不明です。

@Lamza、@Devolus、@Werner Henze に感謝します。彼らの意見はすべて役に立ち、最終的な問題は憂鬱なほどありふれたものでした。

于 2013-06-11T14:39:24.160 に答える