アサーション¶
assert¶
実行時に条件を満たさないと std::abort を呼び出してプログラムを異常終了させる処理です。
assert
を使用するには <cassert>
のインクルードが必要です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
|
実行結果は次のようになります。
$ ./a.exe
5
assertion "!v.empty()" failed: file "main.cc", line 7, function: int Max(const std::vector<int>&)
Aborted (コアダンプ)
assert
は開発中にバグを取り除くことを想定した機能で、 NDEBUG
が定義されるリリースビルドでは無効となります。
NDEBUG
を定義するには -DNDEBUG
を指定します。
$ g++ -std=c++11 -DNDEBUG main.cc
NDEBUG
を定義してビルドすると実行結果は次のように変化します。
$ ./a.exe
5
-2147483648
static_assert¶
コンパイル時に条件を満たさないとコンパイルエラーにする処理です。
template <typename T, int N>
class Array {
static_assert(N > 0, "サイズは0より大きくなければなりません");
public:
int size() const { return N; }
T data_[N]; // サイズ 0 の配列はコンパイルエラーにならない
};
int main() {
Array<int, 0> a;
return 0;
}
コンパイル結果は以下のようになります。
$ g++ -std=c++11 -c main.cc
main.cc: In instantiation of ‘class Array<int, 0>’:
main.cc:12:19: required from here
main.cc:3:5: エラー: static assertion failed: サイズは0より大きくなければなりま
せん
static_assert(N > 0, "サイズは0より大きくなければなりません");
^~~~~~~~~~~~~