_ASSERT
、 _ASSERTE
、 _ASSERT_EXPR
マクロ
式を評価し、結果が 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
マクロ