_ASSERT マクロ、_ASSERTE マクロ
更新 : 2007 年 11 月
式を評価し、結果が False の場合はデバッグ レポートを生成します。デバッグ バージョンのみで有効です。
_ASSERT(
booleanExpression
);
_ASSERTE(
booleanExpression
);
パラメータ
- booleanExpression
0 または 0 以外になる式 (ポインタ値を含む)。
解説
_ASSERT マクロおよび _ASSERTE マクロには、デバッグ時に条件式をチェックするための安全で単純な機構を搭載したアプリケーションが用意されています。これらのマクロは柔軟性に富んでいます。#ifdef ステートメントで囲む必要がないためで、アプリケーションのリリース版ビルドで呼び出さずにすみます。この柔軟性は、_DEBUG マクロの使用によって得られます。_ASSERT および _ASSERTE は、_DEBUG が定義されている場合にのみ使用できます。_DEBUG が未定義の場合、これらのマクロの呼び出しはプリプロセス時に削除されます。
_ASSERT および _ASSERTE は booleanExpression 引数を評価します。結果が false (0) ならば、診断メッセージを表示し、_CrtDbgReportW を呼び出してデバッグ レポートを生成します。_ASSERT マクロは単純に診断メッセージを表示するのに対し、_ASSERTE マクロはエラーの発生した式を文字列形式でメッセージに表示します。これらのマクロは、booleanExpression が 0 以外になる場合は、無効です。
Visual C++ 2005 では、_ASSERT および _ASSERTE は _CrtDbgReportW を呼び出し、それによりすべての出力がワイド文字になります。また、_ASSERTE は booleanExpression で適宜 Unicode 文字を出力します。
_ASSERTE マクロの生成するレポートではエラーの発生した式が特定されるため、ユーザーはアプリケーションのソース コードを参照しなくても問題を識別できます。ただし、_ASSERTE によって計算された式はすべて文字列定数としてアプリケーションの出力 (デバッグ バージョン) ファイルに書き込まれます。このため、_ASSERTE に多数の呼び出しがある場合は、これらの式によって出力ファイルのサイズがかなり大きくなる可能性があります。
_CrtSetReportMode 関数および _CrtSetReportFile 関数を指定しなかった場合は、ポップアップ ダイアログ ボックスにメッセージが表示されます。これは、次の設定と等しい内容です。
_CrtSetReportMode(CRT_ASSERT, _CRTDBG_MODE_WNDW);
_CrtDbgReport または _CrtDbgReportW はデバッグ レポートを生成し、現在の詳細モードおよび _CRT_ASSERT レポートの種類に対して定義されたファイルに基づいてレポートの出力先を決定します。既定では、アサーションの失敗およびエラーが発生すると、デバッグ メッセージ ウィンドウが表示されます。各レポートの種類に対する出力先を定義するには、_CrtSetReportMode 関数と _CrtSetReportFile 関数を使用します。
出力先がデバッグ メッセージ ウィンドウのときにユーザーが [再試行] をクリックすると、_CrtDbgReport または _CrtDbgReportW は 1 を返します。このとき、Just-In-Time (JIT) デバッグが有効ならば、_ASSERT マクロと _ASSERTE マクロがデバッガを起動します。
レポート処理の詳細については、「_CrtDbgReport、_CrtDbgReportW 関数」を参照してください。アサーション失敗の解決方法と、これらのマクロをデバッグ エラー処理機構として扱う場合の使い方の詳細については、「レポート用マクロの使用」を参照してください。
デバッグ レポートの生成には _RPT, _RPTF のデバッグ マクロも使用できますが、これらのマクロは式を計算しません。_RPT マクロは単純なレポートを生成します。_RPTF マクロは生成したレポートに、このレポート マクロが呼び出されたソース ファイルと行番号を含めます。_ASSERTE マクロに加えて、ANSI assert ルーチンをプログラム ロジックの検証に使用できます。このルーチンは、C ランタイム ライブラリのリリース バージョンとデバッグ バージョンの両方で使用できます。Visual C++ 2005 では、マクロのワイド文字バージョン (_RPTWn、_RPTFWn) を使用できます。ワイド文字バージョンは、すべての文字列パラメータと出力にワイド文字列が使用される点を除いてナロー文字バーションと同じです。
_ASSERT マクロと _ASSERTE マクロは、Crtdbg.h をインクルードすると取得できます。ただし、これらのマクロは他のランタイム関数を呼び出すため、アプリケーションを次のライブラリのいずれかにリンクしておく必要があります。
Libcmtd.lib
マルチスレッド スタティック ライブラリ (デバッグ バージョン)Msvcrtd.lib
Msvcr90d.dll のインポート ライブラリ (デバッグ バージョン)
必要条件
マクロ |
必須ヘッダー |
---|---|
_ASSERT |
<crtdbg.h> |
_ASSERTE |
<crtdbg.h> |
使用例
次のプログラムでは、_ASSERT マクロと _ASSERTE マクロを呼び出して、条件 string1 == string2 をテストします。条件が失敗した場合は、マクロが診断メッセージを出力します。このプログラムでは、_RPTn と _RPTFn のマクロ グループを printf 関数の代わりに使用しています。
// crt_ASSERT_macro.c
// compile with: /D_DEBUG /MTd /Od /Zi /link /verbose:lib /debug
//
// This program uses the _ASSERT and _ASSERTE debugging macros.
//
#include <stdio.h>
#include <string.h>
#include <malloc.h>
#include <crtdbg.h>
int main()
{
char *p1, *p2;
// The Reporting Mode and File must be specified
// before generating a debug report via an assert
// or report macro.
// This program sends all report types to STDOUT.
_CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE);
_CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDOUT);
_CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_FILE);
_CrtSetReportFile(_CRT_ERROR, _CRTDBG_FILE_STDOUT);
_CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_FILE);
_CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDOUT);
// Allocate and assign the pointer variables.
p1 = (char *)malloc(10);
strcpy_s(p1, 10, "I am p1");
p2 = (char *)malloc(10);
strcpy_s(p2, 10, "I am p2");
// Use the report macros as a debugging
// warning mechanism, similar to printf.
// Use the assert macros to check if the
// p1 and p2 variables are equivalent.
// If the expression fails, _ASSERTE will
// include a string representation of the
// failed expression in the report.
// _ASSERT does not include the
// expression in the generated report.
_RPT0(_CRT_WARN,
"Use the assert macros to evaluate the expression p1 == p2.\n");
_RPTF2(_CRT_WARN, "\n Will _ASSERT find '%s' == '%s' ?\n", p1, p2);
_ASSERT(p1 == p2);
_RPTF2(_CRT_WARN, "\n\n Will _ASSERTE find '%s' == '%s' ?\n",
p1, p2);
_ASSERTE(p1 == p2);
_RPT2(_CRT_ERROR, "'%s' != '%s'\n", p1, p2);
free(p2);
free(p1);
return 0;
}
Use the assert macros to evaluate the expression p1 == p2.
crt_ASSERT_macro.c(54) :
Will _ASSERT find 'I am p1' == 'I am p2' ?
crt_ASSERT_macro.c(55) : Assertion failed!
crt_ASSERT_macro.c(58) :
Will _ASSERTE find 'I am p1' == 'I am p2' ?
crt_ASSERT_macro.c(59) : Assertion failed: p1 == p2
'I am p1' != 'I am p2'
.NET Framework の相当するアイテム
System::Diagnostics::Debug::Assert