[PR]

assert マクロを使う

戻る

assert( expression )

 関数型マクロ assert() は式 expression が 偽 の場合に診断メッセージを表示して関数 abort() を呼び出します。
 ヘッダファイル assert.h がインクルードされる前にマクロ NDEBUG を定義するとマクロ assert() の呼び出しは除去されます。


 assert() マクロは簡単な論理エラーを検出するために役立つ道具の一つです。
 前提条件を仮定している場所に assert() マクロを挿入しておくと論理エラーを発見しやすくなります。
 たとえば次のような前提条件を検査できます。

 // 例えば引数にポインタ NULL を認めない関数の先頭で引数の仮定を検査するために
 // ポインタ p は NULL ではないはずだ!
 assert( p );

 // ストリーム fp の現在位置はファイル終端ではないはずだ!
 assert( !feof( fp ) );

 // 数 a と数 b の合計は INT_MAX を超えないはずだ!
 assert( INT_MAX - a >= b );

 // 例えば switch 文の default ラベルなどで
 // この文は実行されないはずだ!
 assert( !"想定外のケース" );

 // 文字 c は大文字であるはずだ!
 assert( isupper( (unsigned char)c ) );

 // 添字 index は配列 array の添字として妥当なはずだ!
 assert( ( 0 <= index ) && ( index < numof(array) ) );

 // 例えば関数 strcat() のように2つの文字列が重複していてはいけない関数で
 // 2つの文字列引数 str1, str2 は異なる文字列を指しているはずだ!
 assert( (str1 > strtail( str2 ))
      || (str2 > strtail( str1 )) );

注意
 式 expression は呼び出し除去後には評価されません。
 式 expression を呼び出し除去後にも評価したい場合は verify() マクロを使ってください。

関連

verify マクロを使う
dbgprintf マクロを使う
コンパイル時アサート


Google
ご意見・ご感想をお聞かせ下さい。匿名で送信できます。

 * 返信が必要な場合には postmaster@katsura-kotonoha.sakura.ne.jp へ直接メールしてください。

水無瀬 優 postmaster@katsura-kotonoha.sakura.ne.jp
IDGは全世界85カ国でIT関連雑誌を発行する出版社です。