_ASSERT マクロ、_ASSERTE マクロ
結果が False (デバッグ バージョンだけ) 場合式を評価しデバッグ レポートを生成します。
_ASSERT(
booleanExpression
);
_ASSERTE(
booleanExpression
);
パラメーター
- booleanExpression
の値が 0 に評価される式はポインター)。
解説
_ASSERT と _ASSERTE マクロはデバッグ中に有無をチェックする処理で単純な機能をアプリケーションに提供します。これらは回避するに #ifdef のステートメントで囲む必要はないため非常に柔軟でありアプリケーションのリリース ビルドで呼び出すことができます。この柔軟性は _DEBUG マクロを使用します。_DEBUG が定義されている場合のみ _ASSERT と _ASSERTE を使用できます。_DEBUG を定義しない場合これらのマクロの呼び出しはプリプロセスで削除されます。
_ASSERT と _ASSERTE は booleanExpression の引数が評価され結果が false (0) 場合デバッグ レポートを生成する診断メッセージを呼び出します _CrtDbgReportW を出力します。_ASSERT マクロは _ASSERTE はメッセージに失敗した式の文字列形式を含めたが簡単な診断メッセージが出力されます。これらのマクロは booleanExpression が以外の場合に何も実行しません。
_ASSERT と _ASSERTE は _CrtDbgReportW を起動しすべての出力がワイド文字です _ASSERTE が正しく booleanExpression の Unicode 文字を出力します。
_ASSERTE マクロは生成されたレポートで失敗の式を指定するとアプリケーションのソース・コードを表示せずに問題を識別できるようにします。ただしは _ASSERTE して評価される式がアプリケーションの出力 (デバッグ バージョン) ファイルに文字列定数として含まれるためです。したがって多数の呼び出しが _ASSERTE になる場合これらの式は出力ファイルのサイズが大幅に向上します。
_CrtSetReportMode と _CrtSetReportFile の関数で特に指定しない限りメッセージを設定することでポップアップ ダイアログ ボックスに表示されます :
_CrtSetReportMode(CRT_ASSERT, _CRTDBG_MODE_WNDW);
_CrtDbgReport または _CrtDbgReportW はデバッグ レポートを生成して_CRT_ASSERT レポートの種類に対して定義されている現在のレポート モードに基づいてターゲットまたはモードとファイルを判定します。既定ではアサーション エラーおよびエラーはデバッグ メッセージ ウィンドウに送信されます。_CrtSetReportMode と _CrtSetReportFile の関数が各レポートの種類の移動先を定義するために使用されます。
コピー先のデバッグ メッセージ ウィンドウでユーザーが ENT1ENT [入力] ボタンをクリックするとJust-In-Time デバッグが有効な場合 _CrtDbgReport または _CrtDbgReportW は 1 を返しデバッガーを開始するに _ASSERT と _ASSERTE マクロに (JIT) なります。
レポートのプロセスの詳細については_CrtDbgReport_CrtDbgReportW の関数を参照してください。アサーション エラーを解決するにはデバッグ エラー処理機構としてこれらのマクロを使用する方法の詳細については検証とレポートのマクロを使用します。 を参照してください。
_RPT_RPTF のデバッグ マクロはデバッグ レポートを生成することもできますが式を評価されません。_RPT マクロは単純なレポートが生成されます。_RPTF のマクロはマクロのレポートが生成されたレポートで呼び出されたソース ファイルと行番号が含まれます。_ASSERTE マクロに加えてプログラム ロジックを確認するにはANSI Assert ルーチンを使用できます。このためライブラリのデバッグ バージョンとリリース バージョンの両方で使用できます。これらのマクロのワイド文字バージョンがあります (_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:: デバッグ :: Assert