Assert() 関数の使用法の概要 (推奨)

高洛峰
リリース: 2017-02-03 14:29:18
オリジナル
1652 人が閲覧しました

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&#39; failed.
ログイン後にコピー

assert() の使用を放棄することの欠点は、頻繁な呼び出しがプログラムのパフォーマンスに大きな影響を与え、追加のオーバーヘッドが追加されることです。デバッグ後、 #include を含むステートメントの前に #define NDEBUG を挿入することでアサート呼び出しを無効にできます。 サンプルコードは次のとおりです。 function 最初に受信パラメータの正当性をチェックします。例:

#include <stdio.h>
#define NDEBUG
#include <assert.h>
ログイン後にコピー

2) 各アサートは 1 つの条件のみをテストします。なぜなら、複数の条件が同時にテストされると、アサーションが失敗した場合に直感的にテストすることが不可能だからです。

Bad:

int resetBufferSize(int nNewSize)
{
  //功能:改变缓冲区大小,
  //参数:nNewSize 缓冲区新长度
  //返回值:缓冲区当前长度
  //说明:保持原信息内容不变   nNewSize<=0表示清除缓冲区
  assert(nNewSize >= 0);
  assert(nNewSize <= MAX_BUFFER_SIZE);
  ...
}
ログイン後にコピー

Good:

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

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

エラー:

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

これは、実行前に i=100 などのエラーが発生した場合、このステートメントは実行されず、その後 i++ コマンドが実行されるためです。実行されません。

正解:

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

4) 論理的かつ視覚的な一貫性を形成するために、assert とそれに続くステートメントは空行にする必要があります。

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

上記は、編集者が紹介したassert()関数の使用法の概要です。ご質問があれば、メッセージを残してください。編集者がすぐに返信します。

assert() 関数の使い方まとめ (推奨) 関連記事をさらに詳しく知りたい場合は、PHP 中国語 Web サイトに注目してください。

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