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
は標準エラー出力に実装定義の診断情報を出力し、
abort
(
)
を呼び出します。診断情報には
expression
のテキスト、および
定義済み変数
__func__
と
(C99以降)
定義済みマクロ
__FILE__
および
__LINE__
の値を含むことが要求されます。
目次 |
パラメータ
| condition | - | スカラー型の式 |
戻り値
(なし)
注記
assert
エラーに追加のメッセージを付加する標準化されたインターフェースは存在しません。ポータブルな方法としては、
コンマ演算子
を使用するか、文字列リテラルと共に
&&
を使用する方法があります:
assert(("There are five lights", 2 + 2 == 5)); assert(2 + 2 == 5 && "There are five lights");
Microsoft CRT
における
assert
の実装は、その基盤となる関数(
_wassert
)が
__func__
または同等の代替を受け取らないため、C99以降の規格に準拠していません。
C23における
assert
の変更(
N2829
)は正式な欠陥報告書ではないものの、C委員会は
実装側に対して
この変更を旧モードにもバックポートすることを推奨しています。
例
出力例:
--- Output with NDEBUG not defined: --- a.out: main.cpp:10: main: Assertion `x >= 0.0' failed. --- Output with NDEBUG defined: --- sqrt(x) = -nan
参考文献
- C23規格 (ISO/IEC 9899:2024):
-
- 7.2.2.1 assertマクロ (p: 196)
- C17規格 (ISO/IEC 9899:2018):
-
- 7.2.1.1 assertマクロ (p: 135)
- C11規格 (ISO/IEC 9899:2011):
-
- 7.2.1.1 assertマクロ (p: 186-187)
- C99標準 (ISO/IEC 9899:1999):
-
- 7.2.1.1 assertマクロ (p: 169)
- C89/C90標準 (ISO/IEC 9899:1990):
-
- 4.2.1.1 assertマクロ
関連項目
|
異常終了を引き起こす(クリーンアップなし)
(関数) |
|
|
C++ documentation
for
assert
|
|