assert
提供: cppreference.com
<tbody>
</tbody>
| ヘッダ <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以上) の値を含むことが要求されます。
|
以下のいずれかの場合、式
|
(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));
例
Run this code
#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)
|
コンパイル時のアサーションチェックを行います |
| (クリーンアップせずに) プログラムを異常終了させます (関数) | |
assert の C言語リファレンス
| |