Windows system >> Windowsの知識 >  >> Linuxシステムチュートリアル >> Linuxについて >> Linuxシステムでassert関数を使うにはどうすればいいですか?

Linuxシステムでassert関数を使うにはどうすればいいですか?

  

プログラムを理解している人なら誰でもassertを知っているかぎり、WindowsでVCに記述し、IDEでdebugまたはreleaseに設定するだけで、コンパイラは自動的にassertを無視します。ただし、Linuxでは、コンパイルコマンドに-DNDEBUGを追加する必要があります。システムはコンパイル時にassertをコンパイルしません。そうでないと、プログラムは実行時にassertによって中断される可能性があります。 Linuxシステムでassert関数を使うにはどうすればいいですか? Linuxシステムでassert関数を使う方法について話しましょう。

次の手順:

プロトタイプ役割それは、プログラムの実行が終了している場合、エラー状態を返すことです「assert.h」で定義されたマクロ、プロトタイプ定義を主張:< Br>

#include "assert.h"

void assert(int expression);

assertの効果は、その値がfalse(つまり0)の場合にexpressionを評価することです。 )それから、それはエラーメッセージをstderr、

に出力し、それからabortを呼び出してプログラムを終了します。

次のプログラムリストbadptr.cを参照してください。

#include "stdio.h"

#include "assert.h"

#include "stdlib.h"

int main(void)

{

ファイル* 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:アサーション `fp‘が失敗しました。

放棄された

assertを使うことの不利な点は頻繁に起こることです呼び出しはプログラムのパフォーマンスに大きな影響を与え、追加のオーバーヘッドを追加します。

デバッグ後、#include "asser.h"を含むステートメントの前に#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)各アサーションは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と次の文は、論理的で視覚的な一貫性を持たせるために空白にする必要があります。

5)ある場所では、assertは条件付きフィルタリングに代わることができません。それでもLinuxシステムでassert関数を使用する方法がわからない場合は、上記の内容を見てください。読んだら、assert関数の使い方を知っているでしょう。興味のあるユーザーは行って調べることができます。

Copyright © Windowsの知識 All Rights Reserved