名前空間
変種
操作

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__ の値を含むことが要求されます。

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

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

目次

[編集] 引数

condition - スカラー型の式

[編集] 戻り値

(なし)

[編集] ノート

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

assert(std::is_same_v<int, int>); // error: assert does not take two arguments
assert((std::is_same_v<int, int>)); // OK: one argument
static_assert(std::is_same_v<int, int>); // OK: not a macro
std::complex<double> c;
assert(c == std::complex<double>{0, 0}); // error
assert((c == std::complex<double>{0, 0})); // OK

[編集]

#include <iostream>
// uncomment to disable assert()
// #define NDEBUG
#include <cassert>
 
int main()
{
    assert(2+2==4);
    std::cout << "Execution continues past the first assert\n";
    assert(2+2==5);
    std::cout << "Execution continues past the second assert\n";
}

出力例:

Execution continues past the first assert
test: test.cc:10: int main(): Assertion `2+2==5' failed.
Aborted

[編集] 関連項目

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