次の方法で共有


_ASSERT マクロ、_ASSERTE マクロ

結果が False します (デバッグ バージョンだけ) である場合、式を評価し、デバッグ レポートを生成します。

_ASSERT( 
   booleanExpression 
);
_ASSERTE( 
   booleanExpression 
);

パラメーター

  • booleanExpression
    0 以外のまたは 0 に評価される式 (ポインターなど)。

解説

_ASSERT と _ASSERTE マクロは、デバッグ中に条件をチェックするために、明快で単純な機能をアプリケーションに提供します。 これらは実行されないように #ifdef のステートメントで囲む必要はないため、非常に柔軟にアプリケーションのリテール ビルドで呼び出すことができます。 この柔軟性は _DEBUG マクロを使用して実行されます。 _DEBUG が定義されている場合にのみ_ASSERT と _ASSERTE を使用できます。 _DEBUG が定義されていない場合、これらのマクロの呼び出しはプリプロセスで削除されます。

_ASSERT と _ASSERTE は booleanExpression の引数が評価され、結果が false (0) の場合、診断メッセージを出力し、デバッグ レポートを生成するに _CrtDbgReportW を呼び出します。 _ASSERT マクロは _ASSERTE はメッセージを中断式の文字列形式を含むが、単純な診断メッセージを出力します。 これらのマクロは booleanExpression が 0 以外のに評価される場合は何も実行しません。

_ASSERT と _ASSERTE は _CrtDbgReportWを呼び出し、すべての出力がワイド文字単位になります _ASSERTE は booleanExpressionで正しく Unicode 文字を出力します。

_ASSERTE マクロは生成されたレポートに失敗した式を指定する場合、ユーザーがアプリケーションのソース・コードを参照しなくても問題を認識できるようになります。 ただし、欠点は _ASSERTE によって評価されるすべての式がアプリケーションの出力 (デバッグ バージョン) ファイルに文字列定数として含まれていることです。 したがって、多数の呼び出しが _ASSERTEに対して、次の式は、出力ファイルのサイズが大幅に向上します。

_CrtSetReportMode_CrtSetReportFile 関数と他の指定がない場合、メッセージは設定にポップアップ ダイアログ ボックスの等価で表示:

_CrtSetReportMode(CRT_ASSERT, _CRTDBG_MODE_WNDW);

_CrtDbgReport または _CrtDbgReportW はデバッグ レポートを生成し、現在のレポート モードに基づいて _CRT_ASSERT のレポートの種類に対して定義される前、または mode とファイルを指定します。 既定で、アサーション エラーおよびエラーはデバッグ メッセージ ウィンドウに送られます。 _CrtSetReportMode_CrtSetReportFile 関数が各レポートの種類の移動先を定義するために使用されます。

配置先がデバッグ メッセージ ウィンドウに、ユーザーが [再試行] ボタンをクリックすると、Just-In-Time (JIT) のデバッグが有効になって _CrtDbgReport または _CrtDbgReportW は 1 を返し、デバッガーを起動するに _ASSERT と _ASSERTE マクロを指定します。

レポート プロセスの詳細については、_CrtDbgReport、_CrtDbgReportW 関数を参照します。 解決のアサーションとデバッグのエラー処理機能としてこれらのマクロを使用する方法の詳細については、「検証とレポートの Using Macros」を参照してください。

_RPT、_RPTF のデバッグ マクロはデバッグ レポートを生成するためにも使用できますが、式は評価されません。 _RPT マクロは単純なレポートが生成されます。 _RPTF マクロはレポート マクロが生成されたレポートに呼び出されたソース ファイル名と行番号が含まれています。 _ASSERTE マクロに加えて、プログラム ロジックを確認するには、ANSI アサートします。 ルーチンを使用できます。 このルーチンは、ライブラリのデバッグ バージョンとリリース バージョンの両方で使用できます。 これらのマクロのワイド文字バージョンを使用できます。_RPTWn、_RPTFWn)。 ワイド文字バージョンは全角文字バージョンと同じものですが、ワイド文字列は、すべての文字列パラメーターおよび出力のために使用されます。

_ASSERT と _ASSERTE がマクロで、Crtdbg.h を含めることによって取得したが、アプリケーションは次のライブラリの 1 にこれらのマクロが他のランタイム関数を呼び出すためにリンクする必要があります。

  • Libcmtd.lib
    マルチスレッド スタティック ライブラリ、デバッグ バージョン。

  • Msvcrtd.lib
    Msvcr90d.dll のインポート ライブラリ、デバッグ バージョン。

必要条件

マクロ

必須ヘッダー

_ASSERT

<crtdbg.h>

_ASSERTE

<crtdbg.h>

使用例

このプログラムでは string1 == string2条件をテストするには、呼び出し _ASSERT_ASSERTE マクロになります。 条件を満たさない場合は、これらのマクロは、診断メッセージを出力します。 マクロの _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;
}
  

同等の .NET Framework 関数

System::Diagnostics::Debug::Assert

参照

関連項目

デバッグ ルーチン

_RPT、_RPTF、_RPTW、_RPTFW のマクロ