assert
| ヘッダー <assert.h> で定義 |
||
#ifdef NDEBUG #define assert(condition) ((void)0) |
(C23まで) | |
| #ifdef NDEBUG #define assert(...) ((void)0) |
(C23以降) | |
マクロassertの定義は、標準ライブラリでは定義されていないNDEBUGという別のマクロに依存します。
ソースコードの<assert.h>がインクルードされる時点でNDEBUGがマクロ名として定義されている場合、assertは何もしません。
NDEBUGが定義されていない場合、assertは(スカラー型でなければならず、そうでない場合の動作は未定義です)その引数(C23まで)__VA_ARGS__から合成された式(C23以降)がゼロと等しいかどうかをチェックします。ゼロと等しい場合、assertは標準エラー出力に実装固有の診断情報(「expression」のテキスト、および「組み込み変数 __func__ および(C99以降)「組み込みマクロ」 __FILE__ と __LINE__ の値を含むことが要求されます)を出力し、abort()を呼び出します。
目次 |
[編集] Parameters
| condition | - | スカラー型の式 |
[編集] Return value
(なし)
[編集] Notes
assertエラーにメッセージを追加するための標準化されたインターフェースはありません。それを追加するポータブルな方法は、カンマ演算子を使用するか、文字列リテラルと&&を使用することです。
assert(("There are five lights", 2 + 2 == 5)); assert(2 + 2 == 5 && "There are five lights");
Microsoft CRTにおけるassertの実装は、その基盤となる関数(_wassert)が__func__またはそれに相当するものを取らないため、C99以降の改訂に準拠していません。
C23(N2829)におけるassertの変更は正式な欠陥報告ではありませんが、C委員会は、古いモードにこの変更をバックポートすることを実装に推奨しています(推奨)。
[編集] Example
実行結果の例
--- Output with NDEBUG not defined: --- a.out: main.cpp:10: main: Assertion `x >= 0.0' failed. --- Output with NDEBUG defined: --- sqrt(x) = -nan
[編集] References
- C23標準 (ISO/IEC 9899:2024)
- 7.2.2.1 The assert macro (p: 196)
- C17標準 (ISO/IEC 9899:2018)
- 7.2.1.1 The assert macro (p: 135)
- C11標準 (ISO/IEC 9899:2011)
- 7.2.1.1 The assert macro (p: 186-187)
- C99標準 (ISO/IEC 9899:1999)
- 7.2.1.1 The assert macro (p: 169)
- C89/C90標準 (ISO/IEC 9899:1990)
- 4.2.1.1 The assert macro
[編集] See also
| (クリーンアップせずに)異常なプログラム終了を引き起こす (関数) | |
| C++ ドキュメント for assert
| |