C語言中斷言ASSERT

2021-09-07 03:25:43 字數 2064 閱讀 8348

我一直以為assert僅僅是個報錯函式,事實上,它居然是個巨集,並且作用並非「報錯」。

在經過對其進行一定了解之後,對其作用及用法有了一定的了解,assert()的用法像是一種「契約式程式設計」,在我的理解中,其表達的意思就是,程式在我的假設條件下,能夠正常良好的運作,其實就相當於乙個if語句:

if(假設成立)

else

但是這樣寫的話,就會有無數個if語句,甚至會出現,乙個if語句的括號從檔案頭到檔案尾,並且大多數情況下,我們要進行驗證的假設,只是屬於偶然性事件,又或者我們僅僅想測試一下,一些最壞情況是否發生,所以這裡有了assert().

assert巨集的原型定義在assert.h中,其作用是如果它的條件返回錯誤,則終止程式執行.

#include "assert.h" 

void assert( int expression );

assert的作用是現計算表示式 expression ,如果其值為假(即為0),那麼它先向stderr列印一條出錯資訊,然後通過呼叫 abort 來終止程式執行。

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

在除錯結束後,可以通過在包含#include 的語句之前插入 #define ndebug 來禁用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不能代替條件過濾   

程式一般分為debug 版本和release 版本,debug 版本用於內部除錯,release 版本發行給使用者使用。斷言assert 是僅在debug 版本起作用的巨集,它用於檢查「不應該」發生的情況。以下是乙個記憶體複製程式,在執行過程中,如果assert 的引數為假,那麼程式就會中止(一般地還會出現提示對話,說明在什麼地方引發了assert)。

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

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

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

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

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

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

assert只有在debug版本中才有效,如果編譯為release版本則被忽略。

C語言中,斷言的使用

標準c中的斷言函式assert 如果斷言函式的引數為0時將觸發斷言函式的執行,會在執行時程式崩潰。我從freertos中學到,freertos中的斷言函式configassert 和標準c中的斷言函式assert 是一樣的,我們可以重新利用他,下面我用乙個簡單的程式例項,來學習下。include i...

C語言斷言assert詳解

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

C語言中的assert

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