C言語/標準ライブラリ/assert.h
ヘッダー<assert.h>
では、マクロ assert
を定義しています。 このマクロは、プログラムが行う仮定を検証し、この仮定が間違っている場合に診断メッセージを表示するために使用することができます。
実行すると、式が偽(つまり0に等しい比較)の場合、assert
はstderr
に失敗した呼び出しの情報を書き込み、その後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
はテストする式が偽の場合にデバッグ情報を表示する。
脚註
[編集]- ^ N2176 C17 ballot ISO/IEC 9899:2017. ISO/IEC JTC1/SC22/WG14. p. 135, §assert '. オリジナルの2018-12-30時点によるアーカイブ。 .
- ^ N1570 Committee Draft — April 12, 2011 ISO/IEC 9899:201x. ISO/IEC. (2011-04-12). p. 145,§ 6.7.10 Static assertions .