assertマクロ
2446 ワード
マクロ名:assert
機能:条件をテストし、プログラムを終了させる可能性があります.
使用法:void assert(int test);
assert()マクロの使い方
assertマクロのプロトタイプ定義はでは、条件がエラーを返すと、プログラムの実行が終了し、プロトタイプ定義が次のように機能します.
#include
void assert( int expression );
assertの役割は、式expressionを先に計算し、値が偽(すなわち0)の場合、stderrにエラー情報を印刷し、abortを呼び出してプログラムの実行を終了することです.
assertを使用する欠点は、頻繁な呼び出しがプログラムのパフォーマンスに大きく影響し、追加のオーバーヘッドが増加することです.
デバッグ終了後、#includeの文の前に#define NDEBUGを挿入してassert呼び出しを無効にします.サンプルコードは以下の通りです.
使用法のまとめと注意事項:
1)関数の開始時に入力パラメータの正当性を検査する
次のようになります.
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ができない箇所がある
注意:浮動小数点数の場合:
#include
//float pi=3.14;
//assert(pi=3.14);//
float pi=3.14f;
assert (pi=3.14f);
---------------------------------------------------------
switch文には常にdefault句があり、情報(Assert)が表示されます.
int number = SomeMethod();
switch(number)
{
case 1: Trace.WriteLine("Case 1:"); break;
case 2: Trace.WriteLine("Case 2:"); break;
default : Debug.Assert(false); break;
}
機能:条件をテストし、プログラムを終了させる可能性があります.
使用法:void assert(int test);
FILE *fin, *fout;
int i, n, m;
fin = fopen("beads.in", "r");
fout = fopen("beads.out", "w");
assert(fin != NULL && fout != NULL);
fscanf(fin, "%d %s", &len, necklace);
assert(strlen(necklace) == len);
assert()マクロの使い方
assertマクロのプロトタイプ定義は
#include
void assert( int expression );
assertの役割は、式expressionを先に計算し、値が偽(すなわち0)の場合、stderrにエラー情報を印刷し、abortを呼び出してプログラムの実行を終了することです.
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ができない箇所がある
注意:浮動小数点数の場合:
#include
//float pi=3.14;
//assert(pi=3.14);//
float pi=3.14f;
assert (pi=3.14f);
---------------------------------------------------------
switch文には常にdefault句があり、情報(Assert)が表示されます.
int number = SomeMethod();
switch(number)
{
case 1: Trace.WriteLine("Case 1:"); break;
case 2: Trace.WriteLine("Case 2:"); break;
default : Debug.Assert(false); break;
}