#assert.h
アサート()
assert.h
ヘッダー ファイルはマクロ assert()
を定義します。これは、プログラムが実行時に指定された条件を満たしていることを確認するために使用され、条件を満たさない場合はエラーが報告され、実行が中止されます。終了しました。このマクロは、多くの場合「アサーション」と呼ばれます。
アサート(PI > 3);
上記のコードは、プログラムがこのステートメント行に到達したときに、変数 PI が 3 より大きいかどうかを検証します。実際に 3 より大きい場合、プログラムは実行を続けますが、そうでない場合は終了し、エラー メッセージが表示されます。
assert()
マクロは式を引数として受け取ります。式が true (戻り値がゼロ以外) の場合、assert()
は効果がなく、プログラムは実行を続けます。式が false (戻り値がゼロ) の場合、assert()
はエラーを報告し、エラー メッセージを標準エラー ストリーム stderr
に書き込み、失敗した式とその式の名前と行を含むファイルを表示します。番号。最後に、abort()
関数を呼び出してプログラムを終了します (abort()
関数のプロトタイプは stdlib.h
ヘッダー ファイルにあります)。
z = x * x - y * y;
アサート(z >= 0);
上記の assert()
ステートメントは、以下のコードに似ています。
if (z < 0) {
put("z が 0 未満");
アボート();
}
アサーションが失敗した場合、プログラムは実行を中断し、次のプロンプトが表示されます。
アサーションが失敗しました: (z >= 0)、関数 main、ファイル /Users/assert.c、行 14。
上記エラーの形式は以下の通りです。
アサーションが失敗しました: [式]、関数 [abc]、ファイル [xyz]、行 [nnn]。
上記のコードでは、角括弧が実際のデータに置き換えられます。
assert()
を使用することにはいくつかの利点があります。問題のファイルと行番号を自動的に特定するだけでなく、コードを変更せずに assert()
をオンまたはオフにするメカニズムもあります。プログラムに問題がないことが確認され、アサーションが必要ない場合は、「#include <assert.h>」文の前にマクロ「NDEBUG」を定義してください。
#defineNDEBUG
#include <assert.h>
次に、プログラムを再コンパイルすると、コンパイラはファイル内のすべての assert()
ステートメントを無効にします。プログラムに再び問題が発生した場合は、#define NDBUG
ディレクティブを削除 (またはコメントアウト) して再度コンパイルし、assert()
ステートメントを再び有効にすることができます。
assert()
の欠点は、追加のチェックが必要となるため、プログラムの実行時間が長くなるということです。
static_assert()
C11 では、コンパイル段階でアサーションを行うために使用される静的アサーション static_assert()
が導入されています。
static_assert(定数式, 文字列リテラル);
static_assert()
は 2 つのパラメータを受け入れます。最初のパラメータ constant-expression
は定数式で、2 番目のパラメータ string-literal
はプロンプト文字列です。最初のパラメータの値が false の場合、コンパイル エラーが生成され、2 番目のパラメータはエラー メッセージです。
static_assert(sizeof(int) == 4, "64 ビット コード生成はサポートされていません。");
上記のコードの意味は、現在のコンピュータの int
型が 4 バイトに等しくない場合、コンパイル エラーが報告されるということです。
static_assert()
はコンパイル段階でのみ実行され、変数の値を取得できないことに注意してください。変数に対して静的なアサーションを行うと、コンパイル エラーが発生します。
int 正(const int n) {
static_assert(n > 0, "値は > 0 である必要があります");
0を返します。
}
変数 n
の値がコンパイル時にわからないため、上記のコードはコンパイル エラーを引き起こします。
static_assert()
の利点は、コンパイル段階でエラーを見つけて実行時のエラーを回避し、開発時間を節約できることです。さらに、いくつかの assert()
アサーションは関数内にありますが、関数が実行されない場合はエラーは報告されませんが、static_assert()
は関数が実行されるかどうかに関係なくアサーションを行います。最後に、「static_assert()」は実行可能コードを生成しないため、実行時のパフォーマンスに影響はありません。
作者: wangdoc
アドレス: https://wangdoc.com/
ライセンス: クリエイティブ・コモンズ 3.0