C標準ライブラリ -<assert.h>

概要

C標準ライブラリのassert.hヘッダーファイルは、という名前のassertマクロであり、プログラムが行った仮定を検証し、仮定が偽の場合に診断メッセージを出力するために使用できます。

assert.h 標準ライブラリは、主にプログラム実行時にアサーションを行うために使用されます。アサーションは仮定をテストするための手段であり、通常はデバッグ段階で使用され、プログラムが期待どおりでない状態になった場合に問題を即座に発見できるようにします。

<assert.h>提供されるアサーション機構は、C言語における有用なツールであり、開発者がプログラムのエラーを早期に発見・修正するのに役立ちます。

定義済みのマクロassert別のマクロを指すNDEBUG、マクロNDEBUG<assert.h> の一部ではありません。<assert.h> を参照するソースファイルで NDEBUG がマクロ名として定義されている場合、assertマクロの定義は次のとおりです:

assert(expression)

assert マクロは、式 expression が真であるかどうかをテストするために使用されます。expression が偽(つまり結果が 0)の場合、assert はエラーメッセージを出力してプログラムの実行を終了します。このエラーメッセージには以下の内容が含まれます:

  • アサーション失敗を引き起こした式
  • ソースファイル名
  • 行番号

リリースバージョンでは、NDEBUG を定義することで、すべての assert アサーションを無効にできます。例:

#define NDEBUG
#include <assert.h>

NDEBUG を定義すると、assert マクロはプリプロセッサによって空文に置き換えられ、実行時のオーバーヘッドは一切発生しません。

以下は、assert の基本的な使用方法を示す簡単な例です:

例

#include <stdio.h>
#include <assert.h>

void test_positive(int x) {
    assert(x > 0);
}

int main() {
    int a = 5;
    int b = -3;

    test_positive(a); // このアサーションは成功します
    test_positive(b); // このアサーションは失敗し、プログラムは終了します

    printf("This line will not be executed if an assertion fails.\n");

    return 0;
}

上記の例では、test_positive(b) を呼び出すと、b が負の数であるため、アサーション x > 0 は失敗し、プログラムは次のようなメッセージを出力して終了します:

Assertion failed: (x > 0), file example.c, line 6

アサーションの役割

  • デバッグ:開発段階では、アサーションを使用することで、プログラムの論理エラーや仮定が成立しない状況を迅速に発見できます。
  • ドキュメント:アサーションはドキュメントの一部として、関数の前提条件と事後条件を記述できます。
  • 防御的プログラミング:本番コードでアサーションをパラメータチェックに使用することは推奨されませんが、場合によってはアサーションを最後の防御線として使用できます。

注意事項

  • パフォーマンス:パフォーマンスに敏感なコードでは、特に大量の呼び出しがある場合、アサーションによって追加のオーバーヘッドが発生する可能性があります。そのため、リリースバージョンでは通常アサーションは無効化されます。
  • エラー処理:アサーションは、予測可能で回復可能なエラー状況を処理するために使用すべきではありません。アサーションは、主にプログラマーのエラーを検出するために使用されます。

ライブラリマクロ

以下に、ヘッダーファイル assert.h で定義されている唯一の関数を示します:

番号関数 & 説明
1void assert(int expression)
これは実際には関数ではなくマクロであり、C プログラムに診断機能を追加するために使用できます。
その他の拡張