Namespaces
Variants

assert

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

#define assert(condition) ((void)0)
#else
#define assert(condition) /*implementation defined*/

#endif
(C23まで)
#ifdef NDEBUG

#define assert(...) ((void)0)
#else
#define assert(...) /*implementation defined*/

#endif
(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委員会は 実装側に対して この変更を旧モードにもバックポートすることを推奨しています。

#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

参考文献

  • 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マクロ

関連項目

異常終了を引き起こす(クリーンアップなし)
(関数)