C言語/標準ライブラリ/assert.h

出典: フリー教科書『ウィキブックス(Wikibooks)』

ヘッダー<assert.h>では、マクロ assert を定義しています。 このマクロは、プログラムが行う仮定を検証し、この仮定が間違っている場合に診断メッセージを表示するために使用することができます。

実行すると、式が偽(つまり0に等しい比較)の場合、assertstderrに失敗した呼び出しの情報を書き込み、その後abort()を呼び出します。 stderrに書き込まれる情報には以下が含まれます。

  • ソースファイル名 (定義済みのマクロ __FILE__)
  • ソースの行数 (定義済みマクロ __LINE__)
  • ソースの関数 (定義済みの識別子 __func__) (C99で追加)
  • 0と評価された式のテキスト
コード例
#include <assert.h>

int main(void)
{
	assert(0);
}
実行結果
Main: Main.c:5: int main(void): Assertion `0' failed.

マクロ NDEBUG の使用[編集]

プログラマはソースコードを変更することなくアサーションを排除することができます。 マクロ NDEBUG が <assert.h> のインクルード前に定義されている場合、assert マクロは単に次のように定義されます。

#define assert(ignore)((void) 0)

のように定義されているため、プログラムには何の影響も与えず、その引数を評価することもありません。したがって、assertに渡される式は、デバッグが無効なときには起こらないので、副作用を「含まない」ものでなければなりません。例えば、以下のようになります。

assert(x = gets())

は、デバッグが無効の場合には行を読み込まず x に値を代入しません。

マクロ[編集]

assertマクロ[編集]

ISO/IEC 9899:2017 § 7.2.1.1 The assert macro[1]

形式
#include <assert.h>
void assert(scalar expression);
機能
assert マクロは、プログラムに診断テストを行うもので、void 式に展開されます。このマクロが実行されると、expression(スカラー型でなければならない)がfalse(つまり0と比較される)の場合、assertマクロは失敗した特定の呼び出しに関する情報(引数のテキスト、ソースファイルの名前、ソース行番号、包含する関数の名前(後者はそれぞれ前処理マクロ__FILE__、__LINE__および識別子__func__の値)を含む)を、実装で定義された形式で標準エラーストリームに書き込みます。
返却値
assertマクロは値を返しません。

static_assertマクロ[編集]

static_assert
キーワード _Static_assert に展開されます。

静的アサーション[編集]

_Static_assert は、コンパイル時に確定される式に対するアサーションです[2]

形式
_Static_assert ( constant-expression , string-literal ) ;
制約事項
constant-expressionは、0と比較して不等でなければならない。
セマンティクス
定数式は、整数の定数式でなければならない。
定数式の値が0と比較して不等であれば、この宣言は何の効果もありません。
それ以外の場合は制約に違反し、実装は文字列リテラルのテキストを含む診断メッセージを生成します。
文字列リテラルのテキストを含む診断メッセージを作成しなければならない。
ただし、文字セットにない文字はメッセージに表示する必要はありません。
C23では、string-literal は省略可能です。

関数[編集]

C99規格では、ヘッダーassert.hで関数を宣言する必要はありません。

注意点[編集]

assertマクロの定義は、ヘッダーassert.hで定義されていないNDEBUGというマクロの状態に依存する。 マクロ NDEBUG は、デバッグ情報を使用しないことを示す。 NDEBUGが定義されている場合、assertは何もしない(引数の評価もしない)式として定義される。 それ以外の場合、assertはテストする式が偽の場合にデバッグ情報を表示する。

脚註[編集]

  1. ^ N2176 C17 ballot ISO/IEC 9899:2017. ISO/IEC JTC1/SC22/WG14. p. 135, §assert '. オリジナルの2018-12-30時点によるアーカイブ。. https://web.archive.org/web/20181230041359/http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf. 
  2. ^ N1570 Committee Draft — April 12, 2011 ISO/IEC 9899:201x. ISO/IEC. (2011-04-12). p. 145,§ 6.7.10 Static assertions. http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf.