assert()

3016 ワード

原文:http://www.cnblogs.com/ggzss/archive/2011/08/18/2145017.html
 
assertマクロのプロトタイプ定義はでは、条件がエラーを返すと、プログラムの実行が終了し、プロトタイプ定義が次のように機能します.
#include <assert.h>
void assert( int expression );

assertの役割は、計算式expressionです.値が偽(すなわち0)の場合、stderrにエラー情報を印刷し、abortを呼び出してプログラムの実行を終了します.次のプログラムリストbadptr.cを参照してください.
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
int main( void )
{
FILE *fp;

fp = fopen( "test.txt", "w" );// ,
assert( fp ); //
fclose( fp );

fp = fopen( "noexitfile.txt", "r" );// ,
assert( fp ); //
fclose( fp ); //
return 0;
}


[root@localhost error_process]# gcc badptr.c [root@localhost error_process]# ./a.out a.out: badptr.c:14: main: Assertion `fp' failed.
assert()の使用を放棄した欠点は、頻繁な呼び出しがプログラムのパフォーマンスに大きく影響し、追加のオーバーヘッドを増加させることです.デバッグ終了後、#includeの文の前に#define NDEBUGを挿入してassert呼び出しを無効にします.サンプルコードは以下の通りです.
#include <stdio.h>
#define NDEBUG
#include <assert.h>

 
使用法のまとめと注意事項:
1)関数の開始時に入力パラメータの正当性を検査する.
int resetBufferSize(int nNewSize)
{
  // : ,
  // :nNewSize
  // :
  // : nNewSize<=0
  assert(nNewSize >= 0);
  assert(nNewSize <= MAX_BUFFER_SIZE);
  ...
}


  
2)assertごとに1つの条件しか検証されません.複数の条件を同時に検証する場合、失敗と断言すると、どの条件が失敗したのかを直感的に判断できません.
悪い:
assert(nOffset>=0 && nOffset+nSize<=m_nInfomationSize);

はい:
assert(nOffset >= 0);
assert(nOffset+nSize <= m_nInfomationSize);

3)assertはDEBUG個のみ有効であるため、環境を変更する文は使用できません.そうすると、プログラムが実際に実行されているときに問題が発生します.
エラー:
assert(i++ < 100);

これは、実行前のi=100などのエラーが発生した場合、この文は実行されず、i++というコマンドは実行されないためです.
正しい:
 assert(i < 100);
i++;

4)assertと後の文は1行空けて、論理的および視覚的な一致感を形成しなければならない.5)条件フィルタリングの代わりにassertができない箇所がある