名前空間
変種
操作

assert

提供: cppreference.com
< cpp‎ | error
 
 
 
 
ヘッダ <cassert> で定義
#ifdef NDEBUG

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

#endif

マクロ assert の定義は、標準ライブラリで定義されない別のマクロ NDEBUG に依存します。

ソースコード内の <cassert> がインクルードされた地点で NDEBUG がマクロ名として定義されている場合、 assert は何もしません。

NDEBUG が定義されていない場合、 assert は引数 (スカラー型を持たなければなりません) をゼロと等しいか比較します。 等しければ、 assert は処理系固有の診断情報を標準エラー出力に出力し、 std::abort を呼びます。 診断情報は expression のテキスト、標準のマクロ __FILE____LINE__ および標準の変数 __func__ (C++11以上) の値を含むことが要求されます。

以下のいずれかの場合、式 assert(E)定数部分式であることが保証されます。

  • assert が最後に定義または最定義された場所 (つまり、ヘッダ <cassert> または <assert.h> が最後にインクルードされた場所) で NDEBUG が定義されている。
  • bool に文脈的に変換された Etrue に評価される定数部分式である。
(C++17以上)

目次

[編集] 引数

condition - スカラー型の式

[編集] 戻り値

(なし)

[編集] ノート

assert関数ライクなマクロであるため、 condition 内の括弧で保護されていないコンマはマクロ引数の区切りと解釈されます。 テンプレート引数リストやリスト初期化でそのようなコンマがしばしば現れます。

assert(std::is_same_v<int, int>); // エラー、 assert は引数を2個取りません。
assert((std::is_same_v<int, int>)); // OK、引数は1個です。
static_assert(std::is_same_v<int, int>); // OK、マクロではありません。
std::complex<double> c;
assert(c == std::complex<double>{0, 0}); // エラー。
assert((c == std::complex<double>{0, 0})); // OK。

assert のエラーに追加のメッセージを追加する標準化されたインタフェースはありません。 移植性のある方法はコンマ演算子を使用することです (オーバーロードされていない場合に限ります)。

assert(("There are five lights", 2 + 2 == 5));

[編集]

#include <iostream>
// 以下の行をコメント解除すると assert() は無効になります。
// #define NDEBUG
#include <cassert>
 
// 未使用の警告を抑制するために (void) を使用します。
#define assertm(exp, msg) assert(((void)msg, exp))
 
int main()
{
    assert(2+2==4);
    std::cout << "Execution continues past the first assert\n";
    assertm(2+2==5, "There are five lights");
    std::cout << "Execution continues past the second assert\n";
}

出力例:

Execution continues past the first assert
test: test.cc:10: int main(): Assertion `((void)"There are five lights", 2+2==5)' failed.
Aborted

[編集] 関連項目

static_assert コンパイル時のアサーションチェックを行います (C++11以上) [edit]
(クリーンアップせずに) プログラムを異常終了させます
(関数) [edit]