asert()関数の使い方のまとめ(推奨)


assetマクロのプロトタイプ定義は<assert.h>にあり、その条件が間違っている場合はプログラム実行を終了し、プロトタイプ定義は以下の通りである。

#include <assert.h>
void assert( int expression );
astertの役割は、現在の計算式expressionであり、もしその値が偽(すなわち0)であれば、先にstderにエラー情報を印刷し、aboortを呼び出してプログラムの実行を終了する。下のプログラムリスト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.
クラスメイト()の使用を放棄した欠点は、頻繁な呼び出しがプログラムの性能に大きく影響し、余分な出費を増やすことです。デバッグが終了した後、assi include<astert.h>の文言を含む前に〹define NDEBUGを挿入することによって、astert呼び出しを無効にすることができます。例のコードは以下の通りです。

#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(nOffset>=0 && nOffset+nSize<=m_nInfomationSize);
はい、

assert(nOffset >= 0);
assert(nOffset+nSize <= m_nInfomationSize);
3)環境を変える語句は使えません。astertはDEBUG個でしか有効ではないので、もしそうすれば、プログラムを使って本当に実行する時に問題が発生します。
エラー:

assert(i++ < 100);
これは、もしエラーが発生したら、例えば実行前のi=100では、この文は実行されないので、i++というコマンドは実行されないからです。
正しい:

 assert(i < 100);
 i++;
4)astertと後の文は1行を空けて、論理と視覚の一致感を形成します。
5)条件の代わりにクラスがフィルタリングできないところがあります。
以上は小编が皆さんに绍介したasert()関数の使い方のまとめです。皆さんに助けてほしいです。もし何かご质问がありましたら、メッセージをください。小编はすぐに皆さんに返事します。ここでも私たちのサイトを応援してくれてありがとうございます。