アサーション
更新 : 2007 年 11 月
このトピックの内容は、次の製品に該当します。
Edition |
Visual Basic |
C# |
C++ |
Web Developer |
---|---|---|---|---|
Express |
ネイティブのみ |
|||
Standard |
ネイティブのみ |
|||
Pro/Team |
ネイティブのみ |
表の凡例 :
対象 |
|
該当なし |
|
既定で非表示のコマンド |
アサート ステートメントでは、プログラムの特定位置にある true となるはずの条件を指定します。この条件が true にならない場合、アサーションは失敗し、プログラムの実行が中断され、[アサートに失敗しました] ダイアログ ボックスが表示されます。
Visual C++ は、次の構成に基づくアサート ステートメントをサポートします。
MFC アサーション (MFC プログラムの場合)
ATLASSERT (ATL を使用するプログラムの場合)
CRT アサーション (C ランタイム ライブラリを使用するプログラムの場合)
ANSI assert 関数 (その他の C/C++ プログラムの場合)
アサーションは、次の目的で使用できます。
論理エラーを検出する。詳細については、「論理エラーの検出」を参照してください。
演算の結果をチェックする。詳細については、「結果のチェック」を参照してください。
処理する必要があるエラー条件をテストする。詳細については、「エラー条件のテスト」を参照してください。
MFC および C ランタイム ライブラリ アサーション
MFC ライブラリまたは C ランタイム ライブラリのアサーションによってデバッガが停止したとき、ソース ファイルが利用可能でない場合は、そのソース ファイル内のアサーションが発生した位置にジャンプします。アサーション メッセージは、[アサートに失敗しました] ダイアログ ボックスだけでなく [出力] ウィンドウにも表示されます。後で参照するためにアサーション メッセージを保存する場合は、[出力] ウィンドウからテキスト ウィンドウへコピーします。[出力] ウィンドウに、他のエラー メッセージが表示されていることもあります。アサーションが失敗した原因を突き止める手掛かりとなるため、これらのエラー メッセージをよく調べてください。
アサーションをコード内で自由に使用して、開発時に発生する多くのエラーを検出できます。仮定を立てるごとにアサート ステートメントを 1 つ記述することをお勧めします。たとえば、引数が NULL でないと仮定した場合、アサート ステートメントを記述して、この仮定が正しいかどうかを確認します。
_DEBUG
アサート ステートメントは、_DEBUG が定義されているときだけコンパイルされます。_DEBUG が定義されていない場合、コンパイラはアサート ステートメントを null ステートメントとして扱います。したがって、プログラムの最終リリース バージョンではアサート ステートメントのオーバーヘッドはゼロとなります。つまり、リリース バージョンのパフォーマンスに影響を与えることなく、コード内で自由にアサート ステートメントを使用できます。#ifdef ディレクティブを使用する必要もありません。
アサーションの副作用
アサーションをコードに追加するときは、そのアサーションに副作用がないことを確認してください。たとえば、次のアサーションについて検討してみます。
ASSERT(nM++ > 0); // Don't do this!
ASSERT 式はプログラムのリリース バージョンでは評価されないため、nM の値は、デバッグ バージョンとリリース バージョンとでは異なります。MFC では、ASSERT の代わりに VERIFY マクロを使用できます。VERIFY は、リリース バージョンで式を評価しますが、その結果はチェックしません。
アサート ステートメントで関数を呼び出す場合は、その関数の評価によって予想外の副作用が生じることがあるため特に注意してください。
ASSERT ( myFnctn(0)==1 ) // unsafe if myFnctn has side effects
VERIFY ( myFnctn(0)==1 ) // safe
VERIFY は、デバッグ バージョンでもリリース バージョンでも myFnctn を呼び出すため、安全に使用できます。ただし、リリース バージョンにも不要な関数呼び出しのオーバーヘッドが残ることになります。