assertマクロ

2446 ワード

マクロ名:assert
機能:条件をテストし、プログラムを終了させる可能性があります.
使用法: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の文の前に#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ができない箇所がある
注意:浮動小数点数の場合:
#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;  
 }