_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_EXPRmessageで 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 関数の代わりにマクロの _RPTFprintf グループをこのプログラムで実行することもできます。

// 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 マクロ