名前空間
変種
操作

assert

From cppreference.com
< c‎ | エラー
ヘッダー <assert.h> で定義
#ifdef NDEBUG

#define assert(condition) ((void)0)
#else
#define assert(condition) /*未定義*/

#endif
(C23まで)
#ifdef NDEBUG

#define assert(...) ((void)0)
#else
#define assert(...) /*未定義*/

#endif
(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

#include <stdio.h>
// uncomment to disable assert()
// #define NDEBUG
#include <assert.h>
#include <math.h>
 
#define TEST(...) __VA_ARGS__
 
int main(void)
{
    double x = -1.0;
    assert(x >= 0.0);
    printf("sqrt(x) = %f\n", sqrt(x));
 
    assert(TEST(x >= 0.0));
 
    return 0;
}

実行結果の例

--- 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

(クリーンアップせずに)異常なプログラム終了を引き起こす
(関数) [編集]
English 日本語 中文(简体) 中文(繁體)