assert()
3016 ワード
原文:http://www.cnblogs.com/ggzss/archive/2011/08/18/2145017.html
assertマクロのプロトタイプ定義はでは、条件がエラーを返すと、プログラムの実行が終了し、プロトタイプ定義が次のように機能します.
assertの役割は、計算式expressionです.値が偽(すなわち0)の場合、stderrにエラー情報を印刷し、abortを呼び出してプログラムの実行を終了します.次のプログラムリストbadptr.cを参照してください.
[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呼び出しを無効にします.サンプルコードは以下の通りです.
使用法のまとめと注意事項:
1)関数の開始時に入力パラメータの正当性を検査する.
2)assertごとに1つの条件しか検証されません.複数の条件を同時に検証する場合、失敗と断言すると、どの条件が失敗したのかを直感的に判断できません.
悪い:
はい:
3)assertはDEBUG個のみ有効であるため、環境を変更する文は使用できません.そうすると、プログラムが実際に実行されているときに問題が発生します.
エラー:
これは、実行前のi=100などのエラーが発生した場合、この文は実行されず、i++というコマンドは実行されないためです.
正しい:
4)assertと後の文は1行空けて、論理的および視覚的な一致感を形成しなければならない.5)条件フィルタリングの代わりにassertができない箇所がある
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
#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ができない箇所がある