アプリケーションで奇妙な状況が発生したようです。_DEBUG が定義されている場合にのみ実行されるはずの ASSERT がトリガーされていますが、アプリケーションがリリース モードでコンパイルされているときに評価されています。
ASSERT はヘッダー ファイルで定義されており、ソース ファイルに含まれている別のヘッダー ファイルからトリガーされています。
さらに調べてみると、ソース ファイルは実際にリリース モードで実行されています (_DEBUG は定義されておらず、NDEBUG は定義されています)。ただし、ヘッダー ファイルには、NDEBUG ではなく、_DEBUG が定義されています。
一般的な通念によれば、ヘッダー ファイルを #include することは、コード行をソース ファイルにカット アンド ペーストすることと同じです。これにより、上記の動作が不可能になります。
VS2010 で大規模な混合言語 (Intel FORTRAN および C++) アプリケーションをコンパイルしています。ただし、この問題はビルド サーバーでも発生するため、単なる VS2010 の「機能」ではないようです。
私たちはチェックしました:
- すべてのプロジェクトはリリースで構築されています。
- 影響を受ける cpp ファイルには、異常なプロパティが設定されていません。
- このソリューションには、_DEBUG または NDEBUG を手動で定義または定義解除するファイルはありません。
- 次のような句を含めることにより、上記の動作を確立しました。
bool is_debug = false;
#ifdef _DEBUG
is_debug = true
#endif
そしてその直後にポイントを破る。
テストするものが不足しています - 私が仮説を立てることができる唯一のものは次のとおりです。
- 一部の標準ライブラリまたは外部インクルードが _DEGUG および NDEBUG を再定義している、または
- 何かが #include マクロをオーバーライドしました (これは可能ですか?)。
編集 - - - - - - - - - - - - - - - - - - - - - - - - - ----------
#error トリック (下記) のおかげもあって、差し迫った問題が見つかりました。いくつかのプロジェクトでは、NDEBUG と _DEBUG が定義されていません。これらのプロジェクトはすべて、マクロ $(PreprocessorDefinitions) から何かを継承することを意図していましたが、これはどこにも定義されていません。
これはまだいくつかの厄介な質問を残します:
- 上記の動作を引き起こしたソース ファイルには、プロジェクト設定で NDEBUG が定義されていますが、含まれているヘッダー ファイルには含まれていません (ただし、VS2010 では正しい #ifdef ブロックがグレー表示されます) 。
- PreprocessorDefinitions マクロがすべての C++ プロジェクトに継承されている場合 (継承されているようです)、どこにも定義されていないのはなぜですか?