アサーションは、言語によって異なる動作をします。C では、これらはしばしば誤って使用され、誤った使用法が非常に一般的であるため、多くの人がそれらをまったく使用しないようにアドバイスしています。NDEBUG
これらは実行を遅くするだけなので、本番環境では使用しないでください (つまり、C の本番コンパイルではプリプロセッサ用に定義する必要があります)。
アサーションの目的は、結果を確認することではなく、論理的な必要性を述べることにあります。たとえば、(C では) 次のように書くのが正しいです。
f = malloc( s );
if( f == NULL ) {
...; exit( 1 );
}
assert( f != NULL ); # This is logically necessary.
しかし、これまでに書くのは完全に間違っています:
f = malloc( x ); # THIS IS AN EXAMPLE OF INCORRECT USAGE
assert( f != NULL ); # DO NOT DO THIS
次のように書くことは完全に有効であるため、これは実際に便利です。
f = xmalloc( x );
assert( f != NULL );
これは、null 値を決して返さないような方法で xmalloc が定義されていることを読者に説明するものです。
関数の開始時によく使用されます。
void f( void *p ) { assert( p != NULL ); ... }
このような使い方はエラーチェックではありません。むしろf
、NULL ポインターが渡されないことを関数が想定していることを示す役割を果たします。null ポインターを渡すことf
はプログラミング エラーであることを開発者に説明します。これをアサーションにすると、アサーションが有効なときに実行時にエラーを検出できるようになります。