<assert.h>はC 標準ライブラリのヘッダーファイルです。Cプリプロセッサマクロを定義し、C 言語における実行時アサーションを実装します。assert
<assert.h>は、 ANSI CのC 標準ライブラリの一部として定義されています。C ++プログラミング言語では、<assert.h>および<cassert>が使用可能で、どちらも機能的に同等です。[ 1 ]
このassertマクロは実行時アサーションを実装します。マクロ内の式が偽の場合、マクロはメッセージを出力し、<stdlib.h>stderrで定義されているを呼び出します。メッセージには、それぞれマクロとからのソースファイル名とソース行番号が含まれます。[ 2 ] C99以降、assert ステートメントの関数名は ( ) として含まれ、式自体も含まれます。[ 3 ] ANSI C では、マクロ内の式は符号付き整数として定義されていますが、符号付き整数に暗黙的にキャストできる式であれば何でも使用できます。C99 では、マクロは明示的に任意のスカラー型を許可します。[ 4 ]このマクロの一般的な使用法は、ポインタがnull でないことをアサートすることと、配列インデックスが範囲内にあることを確認することです。[ 5 ]abort()__FILE____LINE____FUNC__assertassertassert
以下はマクロを使用したプログラムですassert。このプログラムは常にpointer偽と評価されます。これは、がヌルポインタpointerであり、有効なメモリ位置を指していないためです。
#include <assert.h> #include <stddef.h>int main () { void * ptr = NULL ; assert ( ptr ); return 0 ; }プログラムをコンパイルして実行すると、以下のようなメッセージが出力されます。
プログラム: source.c:5: main: アサーション 'ptr' が失敗しました。異常終了 (コアダンプ)マクロの定義は、assert別のマクロの定義に応じて変化しますNDEBUG。NDEBUGがマクロ名として定義されている場合、assertマクロは と定義されます#define assert(ignore) ((void)0)。[ 3 ]その結果、マクロは式を評価しません。 の使用は、 1 つ以上のステートメントに副作用 がNDEBUG含まれている場合、プログラム全体の動作に影響を与える可能性があります。これらのステートメントは評価されないためです。[ 6 ]assert
マクロにはエラーメッセージはassert含まれていません。ただし、カンマ演算子を使用して、次のように印刷式にエラーメッセージを追加できます。[ 7 ]assert(("Not Orwellian",2+2==5));
C++11static_assertで追加されたキーワードは、マクロと同様の目的を果たします。マクロとは異なり、実行時ではなくコンパイル時に実行されます。 [ 8 ]元の実装ではテンプレートハックが使用されていました。キーワードは、ブール値に変換できる定数式と文字列リテラルを受け取ります。式が失敗した場合は文字列リテラルが返され、そうでない場合はアサーションは効果がありません。[ 8 ] C++17では、このアサーション失敗メッセージはオプションとなり、指定されていない場合は後続のメッセージは省略されます。[ 9 ]assertassertstatic_assertstatic_assert
C11では、機能的に同等の宣言が_Static_assert追加されました。 は、C++との互換性を確保するために のエイリアスとして<assert.h>定義されています。[ 10 ] C23では、は に名前が変更され、文字列リテラル引数はオプションになりました。[ 11 ] [ 12 ] Gnulib は、C11 を使用しないプラットフォーム向けにを定義しており、を含める必要はありません。[ 13 ]static_assert_Static_assert_Static_assertstatic_assertstatic_assert<assert.h>
C++26contract_assertで追加されたキーワードは、契約のアサーションに使用され、実行中に条件が満たされていることを確認することで、マクロと同様の内部条件の検証に使用されます。[ 14 ] [ 15 ]assert()
int f ( vector < int >& v ) pre ( v . size () >= 1 && v [ 0 ] > 0 ) post ( r : r == v [ 0 ] && r != 1 ) { // ... contract_assert ( v [ 0 ] != 1 ); // ... return v [ 0 ]; }Javaでは、assertはキーワードです。
C#にはアサーション マクロやキーワードはありませんが、代わりにメソッドを提供するクラスSystem.Diagnostics.Debugがあります。System.Diagnostics.TraceAssert()
Rustにはマクロがありますassert!()。
{{cite web}}: CS1 maint: 複数の名前: 著者リスト (リンク){{cite report}}: CS1 maint: 数値名: 著者リスト (リンク){{cite report}}: CS1 maint: 数値名: 著者リスト (リンク)