assert()函式的使用

2021-06-22 19:21:49 字數 2027 閱讀 3845



assert巨集的原型定義在中,其作用是如果它的條件為假,則終止程式執行,原型定義,assert ()是乙個除錯程式時經常使用的巨集,在程式執行時它計算括號內的表示式,如果表示式為false (0), 程式將報告錯誤,並終止執行。如果表示式不為0,則繼續執行後面的語句。這個巨集通常原來判斷程式中是否出現了明顯非法的資料,如果出現了終止程式以免導致嚴重後果,同時也便於查詢錯誤:

#include

void assert( int expression );

assert的作用是現計算表示式expression,如果其值為假(即為0),那麼它先向stderr列印一條出錯資訊,

然後通過呼叫abort 來終止程式執行。

請看下面的程式清單badptr.c:

#include

#include

#include

int main( void )

[root@localhost error_process]# gccbadptr.c

[root@localhost error_process]# ./a.out

a.out: badptr.c:14: main: assertion `fp'failed.

已放棄

使用assert的缺點是,頻繁的呼叫會極大的影響程式的效能,增加額外的開銷。

在除錯結束後,可以通過在包含#include 的語句之前插入#definendebug 來禁用assert呼叫,示例**如下:

#include

#define ndebug

#include

用法總結與注意事項:

1)在函式開始處檢驗傳入引數的合法性

如:int resetbuffersize(int nnewsize)

2)每個assert只檢驗乙個條件,因為同時檢驗多個條件時,如果斷言失敗,無法直觀的判斷是哪個條件失敗

不好: 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不能代替條件過濾

assert 不是乙個倉促拼湊起來的巨集,assert 不應該產生任何***。所以assert 不是函式,而是巨集。程式設計師可以把assert 看成乙個在任何系統狀態下都可以安全使用的無害測試手段。

很少有比跟蹤到程式的斷言,卻不知道該斷言的作用更讓人沮喪的事了。你花了很多時間,不是為了排除錯誤,而只是為了弄清楚這個錯誤到底是什麼。有的時候,程式設計師偶爾還會設計出有錯誤的斷言。所以如果搞不清楚斷言檢查的是什麼,就很難判斷錯誤是出現在程式中,還是出現在斷言中。幸運的是這個問題很好解決,只要加上清晰的注釋即可。這本是顯而易見的事情,可是很少有程式設計師這樣做。這好比乙個人在森林裡,看到樹上釘著一塊「危險」的大牌子。但危險到底是什麼?樹要倒?有廢井?有野獸?除非告訴人們「危險」是什麼,否則這個警告牌難以起到積極有效的作用。難以理解的斷言常常被程式設計師忽略,甚至被刪除。

以下是使用斷言的幾個原則:

(1)使用斷言捕捉不應該發生的非法情況。不要混淆非法情況與錯誤情況之間的區別,後者是必然存在的並且是一定要作出處理的。

(2)使用斷言對函式的引數進行確認。

(3)在編寫函式時,要進行反覆的考查,並且自問:「我打算做哪些假定?」一旦確定了的

假定,就要使用斷言對假定進行檢查。

(4)一般教科書都鼓勵程式設計師們進行防錯性的程式設計,但要記住這種程式設計風格會隱瞞錯誤。當進行防錯性程式設計時,如果「不可能發生」的事情的確發生了,則要使用斷言進行報警。

assert函式使用

assert巨集的原型定義在中,其作用是如果它的條件返回錯誤,則終止程式執行,原型定義 include assert.h void assert intexpression assert的作用是現計算表示式 expression 如果其值為假 即為0 那麼它先向stderr列印一條出錯資訊,然後通過...

Python學習之assert 函式的使用

斷言函式是對表示式布林值的判斷,要求表示式計算值必須為真。可用於自動除錯。如果表示式為假,觸發異常 如果表示式為真,不執行任何操作。1 簡單舉例 assert 1 1 assert 5 1 a hello b hello assert a b assert 中表示式都為真,故程式正常執行,不會報錯,...

assert函式的用法

編寫 時,我們總會做出一些假設,斷言就是用於在 處理這些假設的形式。斷言表示相信在程式中的某個在程式中的某個特定點該表示式為真。可以在任何時候啟用和禁用斷言驗證,因此可以在測試時使用斷言,在部署時禁用斷言。1 斷言 斷定表示式一定為真,如果為假程式崩潰。2.報告崩潰的情況和位置 include in...