式を評価し、結果が false の場合に、デバッグ レポートを生成します (デバッグ バージョンのみ)。
構文
// Typical usage:
_ASSERT_EXPR( booleanExpression, message );
_ASSERT( booleanExpression );
_ASSERTE( booleanExpression );
パラメーター
booleanExpression
0 以外 (true) または 0 (false) に評価されるスカラー式 (ポインター式)。
message
レポートの一部として表示するワイド文字列。
解説
_ASSERT_EXPRマクロ、 _ASSERT マクロ、 _ASSERTE マクロは、デバッグ プロセス中に前提を検査するためのクリーンでシンプルなメカニズムを持つアプリケーションを提供します。 アプリケーションのリテール ビルドで呼び出されないように、 #ifdef ステートメントで囲む必要がないため、柔軟です。 この柔軟性は、 _DEBUG マクロを使用して実現されます。
_ASSERT_EXPR、 _ASSERT 、 _ASSERTE は、 _DEBUG がコンパイル時に定義される場合にのみ使用できます。
_DEBUG が定義されていない場合、これらのマクロの呼び出しは前処理で削除されます。
_ASSERT_EXPR、_ASSERT、_ASSERTE ではその booleanExpression 引数が評価されます。結果が false (0) の場合は診断メッセージが出力され、_CrtDbgReportW を呼び出してデバッグ レポートが生成されます。
_ASSERT マクロでは、単純な診断メッセージが出力されます。 _ASSERTE には、メッセージ内の失敗した式の文字列表現が含まれます。_ASSERT_EXPR には、診断メッセージの message 文字列が含まれます。
booleanExpression が 0 以外に評価されると、これらのマクロは何も行いません。
_ASSERT_EXPR、 _ASSERT 、 _ASSERTE は _CrtDbgReportWを呼び出します。これにより、すべての出力がワイド文字になります。
_ASSERTE プロパティは booleanExpression で Unicode 文字を正しく出力し、 _ASSERT_EXPR は messageで Unicode 文字を出力します。
_ASSERTE マクロは失敗した式を指定し、 _ASSERT_EXPR は生成されたレポートにメッセージを指定できるようにするため、ユーザーはアプリケーションのソース コードを参照せずに問題を特定することができます。 ただし、欠点もあります。 message によって出力されるすべての _ASSERT_EXPR と、 _ASSERTE によって評価されるすべての式は文字列定数としてアプリケーションの出力 (デバッグ バージョン) ファイルに組み込まれます。 そのため、 _ASSERT_EXPR または _ASSERTEに対して多数の呼び出しが行われると、これらの式により、出力ファイルのサイズが大幅に増えます。
_CrtSetReportMode関数と_CrtSetReportFile関数で特に指定しない限り、メッセージは設定と同等のポップアップ ダイアログ ボックスに表示されます。
_CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_WNDW);
_CrtDbgReportW は、現在のレポート モード (複数可) と、 _CRT_ASSERT レポートの種類に定義されているファイルに基づいて、デバッグ レポートを生成し、その宛先 (複数可) を決定します。 既定では、アサーション エラーとエラーは、デバッグ メッセージ ウィンドウに送られます。
_CrtSetReportMode関数と_CrtSetReportFile関数を使用して、各レポートの種類の変換先を定義します。
宛先がデバッグ メッセージ ウィンドウで、ユーザーが [ Retry ] ボタンを選択すると、 _CrtDbgReportW 1 が返され、Just-In-Time (JIT) デバッグが有効になっている場合、 _ASSERT_EXPR、 _ASSERT 、および _ASSERTE マクロがデバッガーを起動します。
レポート処理の詳細については、_CrtDbgReport、_CrtDbgReportW の関数に関するページを参照してください。 アサーション エラーの解決と、これらのマクロをデバッグ エラー処理メカニズムとして使用する方法の詳細については、「 Macros for reporting」を参照してください。
_ASSERT マクロの他に、プログラム ロジックの検証に assert マクロを使用できます。 このマクロは、ライブラリのデバッグ バージョンとリリース バージョンの両方で使用できます。
_RPT、_RPTF のデバッグ マクロをデバッグ レポート生成のために使用することもできますが、式は評価されません。
_RPT マクロは単純なレポートを生成します。
_RPTF マクロは、ソース ファイルと、レポート マクロが呼び出された行番号を、生成されるレポートに組み込みます。 これらのマクロのワイド文字バージョンを使用できます (_RPTW、 _RPTFW)。 ワイド文字バージョンは、ワイド文字列がすべての文字列パラメーターと出力で使用できるという点を除き、ナロー文字バージョンと同一です。
_ASSERT_EXPR、_ASSERT、_ASSERTE はそれぞれマクロであり、<crtdbg.h> を組み込むことによって使用可能になりますが、_DEBUG が定義されるときに、アプリケーションを C ランタイム ライブラリのデバッグ バージョンとリンクさせる必要があります。これらのマクロによって、他のランタイム関数が呼び出されるためです。
要件
| マクロ | 必須ヘッダー |
|---|---|
_ASSERT_EXPR、 _ASSERT、 _ASSERTE |
<crtdbg.h> |
例
このプログラムでは、 _ASSERT マクロと _ASSERTE マクロが呼び出され、条件 string1 == string2がテストされます。 条件が失敗した場合、これらのマクロは診断メッセージを出力します。
_RPT 関数の代わりにマクロの _RPTF と 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'
関連項目
デバッグ ルーチン
assert マクロ、_assert、_wassert
_RPT、_RPTF、_RPTW、_RPTFW マクロ