assert マクロ、 _assert_wassert

式を評価し、結果が falseの場合、診断メッセージを出力し、プログラムを中止します。

構文

assert(
   expression
);
void _assert(
   char const* message,
   char const* filename,
   unsigned line
);
void _wassert(
   wchar_t const* message,
   wchar_t const* filename,
   unsigned line
);

パラメーター

expression
0 以外 (true) または 0 (false) に評価されるスカラー式 (ポインター式)。

message
表示するメッセージ。

filename
アサーションが失敗したソース ファイルの名前。

line
失敗したアサーションのソース ファイルの行番号。

解説

assert マクロは通常、プログラム開発中の論理エラーを識別するために使用されます。 正しく動作しないときにのみ expression に評価される false 引数を実装することにより、予期しない条件が発生したときにプログラムの実行を停止するために使用します。 マクロ NDEBUGを定義することにより、コンパイル時にアサーション チェックをオフにすることができます。 /DNDEBUG コマンド ライン オプションを使用することにより、ソース ファイルを変更せずに assert マクロをオフにすることができます。 <assert.h> が組み込まれる前に #define NDEBUG ディレクティブを使用することにより、ソース コードの assert マクロをオフにすることができます。

expressionfalse (0) に評価し、abort を呼び出してプログラム実行を停止する際、assert マクロは診断メッセージを出力します。 expressiontrue (0 以外) の場合、アクションは取られません。 診断メッセージには、失敗した式、ソース ファイルの名前、アサーションが失敗した行番号が含まれます。

診断メッセージはワイド文字 (wchar_t)で出力されます。 したがって、式に Unicode 文字がある場合でも、予期していたとおりに機能します。

ルーチンを呼び出したアプリケーションの種類に基づいて診断メッセージの出力先が決まります。 コンソール アプリケーションは、stderr を使用してメッセージを受け取ります。 Windows ベースのアプリケーションで、assert は Windows MessageBox 関数を呼び出し、メッセージ ボックスを作成して、メッセージと 3 つのボタン ([中止][再試行][無視]) を表示します。 ユーザーが Abort を選択すると、プログラムはすぐに中止されます。 ユーザーが Retry を選択した場合、デバッガーが呼び出され、Just-In-Time (JIT) デバッグが有効になっている場合、ユーザーはプログラムをデバッグできます。 ユーザーが Ignore を選択した場合、プログラムは通常の実行を続行します。 エラー条件が存在するときに [無視] をクリックすると、呼び出し元のコードの事前条件が満たされていないので、未定義の動作が発生する可能性があります。

アプリの種類に関係なく既定の出力動作をオーバーライドするには、_set_error_mode を呼び出して、stderr への出力動作とダイアログボックスの表示動作の間で選択します。

assert がメッセージを表示すると、abort を呼び出し、[中止][再試行][無視] のボタンを備えたダイアログ ボックスが表示されます。 abort によってプログラムが終了します。そのため、assert 呼び出しの後に、[再試行][無視] ボタンを押してもプログラムの実行は再開されません。 assert によってダイアログ ボックスが表示された場合、abort ダイアログ ボックスは表示されません。 abortダイアログ ボックスが表示されるのは、assertが stderr に出力を送信する場合だけです。

上記の動作の結果として、デバッグ モードでの assert 呼び出しの後にダイアログ ボックスが常に表示されます。 各ボタンの動作を次の表に示します。

エラー モード stderr への出力 (コンソール/_OUT_TO_STDERR) ダイアログ ボックスの表示 (Windows/_OUT_TO_MSGBOX)
Abort 終了コード 3 で直ちに終了します 終了コード 3 で直ちに終了します
Retry abort 中にデバッガーが起動します assert 中にデバッガーが起動します
Ignore abort を使用して終了処理を完了します assertが起動しなかったかのようにプログラムを続行します (呼び出し元のコードの前提条件が満たされていないため、未定義の動作が発生する可能性があります)

CRT デバッグの詳細については、「 CRT デバッグ手法を参照してください。

_assert 関数と _wassert 関数は、内部 CRT 関数です。 これらは、アサーションをサポートするためのオブジェクト ファイルに必要なコードを最小限に抑えるうえで役立ちます。 これらの関数を直接呼び出すことはお勧めしません。

NDEBUG が定義されていない場合、assert マクロは、C ランタイム ライブラリのリリース バージョンとデバッグ バージョンの両方で有効になります。 NDEBUGが定義されている場合、マクロは使用できますが、その引数は評価されないため、効果はありません。 マクロが有効な場合、assert マクロは実装のために _wassert を呼び出します。 その他のアサーション マクロ (_ASSERT_ASSERTE_ASSERT_EXPR) も使用できますが、これらは、_DEBUG マクロが定義されており、かつ C ランタイム ライブラリのデバッグ バージョンとリンクされたコードにある場合にのみ、渡される式を評価します。

要件

ルーチンによって返される値 必須ヘッダー
assert, _wassert <assert.h>

_assert 関数の署名は、ヘッダー ファイルでは使用できません。 _wassert 関数の署名は、NDEBUG マクロが定義されていない場合にのみ使用できます。

このプログラムでは、 analyze_string 関数は、 assert マクロを使用して、文字列と長さに関連するいくつかの条件をテストします。 条件のいずれかが失敗した場合、プログラムは失敗の原因を示すメッセージを出力します。

// crt_assert.c
// compile by using: cl /W4 crt_assert.c
#include <stdio.h>
#include <assert.h>
#include <string.h>

void analyze_string( char *string );   // Prototype

int main( void )
{
   char  test1[] = "abc", *test2 = NULL, test3[] = "";

   printf ( "Analyzing string '%s'\n", test1 ); fflush( stdout );
   analyze_string( test1 );
   printf ( "Analyzing string '%s'\n", test2 ); fflush( stdout );
   analyze_string( test2 );
   printf ( "Analyzing string '%s'\n", test3 ); fflush( stdout );
   analyze_string( test3 );
}

// Tests a string to see if it is NULL,
// empty, or longer than 0 characters.
void analyze_string( char * string )
{
   assert( string != NULL );        // Cannot be NULL
   assert( *string != '\0' );       // Cannot be empty
   assert( strlen( string ) > 2 );  // Length must exceed 2
}

プログラムは次の出力を生成します。

Analyzing string 'abc'
Analyzing string '(null)'
Assertion failed: string != NULL, file crt_assert.c, line 25

アサーションが失敗した後、オペレーティング システムとランタイム ライブラリのバージョンに応じて、以下のような内容のメッセージ ボックスが表示される可能性があります。

A problem caused the program to stop working correctly. Windows will close the program and notify you if a solution is available.

デバッガーがインストールされている場合は [デバッグ] ボタンを選択してデバッガーを開始するか、 [プログラムの終了] をクリックして終了します。

関連項目

エラー処理
プロセスと環境の制御
abort
raise
signal
_ASSERT_ASSERTE_ASSERT_EXPR マクロ
_DEBUG