assert()関数の使用法の概要

黄舟
リリース: 2016-12-28 13:19:26
オリジナル
1982 人が閲覧しました

assert マクロのプロトタイプは、 で定義されています。その機能は、その条件がエラーを返した場合にプログラムの実行を終了することです。プロトタイプ定義:

#include <assert.h>
void assert( int expression );
ログイン後にコピー

assert の機能は、その値が次の場合に式を計算することです。 False (つまり 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 を挿入することでアサート呼び出しを無効にできます。 サンプルコードは次のとおりです。

#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) 各アサートは 1 つの条件のみをテストします。なぜなら、複数の条件が同時にテストされると、アサーションが失敗した場合、どの条件が失敗したかを直感的に判断することが不可能だからです。例:

良くない:

assert(nOffset>=0 && nOffset+nSize<=m_nInfomationSize);
ログイン後にコピー

良い:

assert(nOffset >= 0);
assert(nOffset+nSize <= m_nInfomationSize);
ログイン後にコピー

3) アサートは DEBUG でのみ有効であるため、環境を変更するステートメントは使用できません。これを行うと、プログラムが実際に実行されているときに問題が発生します。例:

エラー:

assert(i++ < 100);
ログイン後にコピー

これは、実行前にエラーが発生した場合 (たとえば、i=100)、このステートメントは実行されず、その後 i++ コマンドも実行されないためです。

正解:

assert(i < 100);
 i++;
ログイン後にコピー

4) 論理的および視覚的な一貫性を生み出すために、assert とそれに続くステートメントは空行に置く必要があります。

5) 場所によっては、assert は条件付きフィルタリングを置き換えることができません。

上記は、assert() 関数の使用法の概要です。さらに関連する内容については、PHP 中国語 Web サイト (www.php.cn) に注目してください。


関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のおすすめ
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!