C語言ASSERT巨集

2021-09-02 20:34:26 字數 1562 閱讀 8829

一、assert函式的目的:

斷言可以對在系統中隱藏很深,用其它手段極難發現的問題進行定位,並且輸出資訊很詳細,可以很好地解決大多數c語言編譯器錯誤資訊輸出不詳細的問題

二、assert巨集的原型,assert在**定義的

c語言中,assert斷言的原型定義在檔案中。assert是乙個巨集定義,並不是乙個函式。其作用是先計算表示式 expression ,如果expression的值為假(即為0),那麼它先向stderr列印一條出錯資訊,然後通過呼叫abort 來終止程式執行。

斷言的訊息會顯示庫依賴,但是它也包含一下資訊,原始檔的名字,處於哪一行,在哪兒發生的,一般的格式如下:

assertion failed: expression, file filename, line line number

三、assert使用範圍

1、放在函式入口,對入口引數進行合法性檢查(如strcpy函式中用assert函式檢查入口引數是否為null)

2、將assert(0)放在預計正常 下不會出現的地方(一旦出現肯定是異常出錯了)

3、放在前置條件必須滿足、後置條件必須滿足、不變條件必須滿足的場合

四、assert使用原則

1、乙個斷言只能檢測乙個條件。

2、斷言檢查只是輔助條件,不能替代條件檢測。

3、不能使用改變環境語句的使用。

4、頻繁使用斷言也會降低效率。並且它的強制停止所以不適合嵌入式程式和伺服器,但也可以改寫只報錯誤而不停止,即不呼叫abort()。

5、不要浪費別人的時間—詳細說明不清楚的斷言;消除所做的隱式假定,或者利用斷言檢查其正確性例如:有時候我們會不自覺的認為乙個位元組佔8位,或者說乙個long型佔據4個位元組,這些都是對編譯程式或作業系統做的一些假定。這使得我們需要在程式中使用斷言例如assert(sizeof(long)==4&&char_bit==8)。

6、斷言是進行除錯檢查的簡單方法。要使用斷言來檢查絕對不應該發生的非法情況,不要混淆非法情況和錯誤情況,錯誤情況是需要在最終產品中處理的。

7、利用斷言對函式的引數進行確認,並且當程式設計師使用了無定義特性時向程式設計師報警。

8、當編寫函式時,應反覆問自己做了哪些假定,一旦確定了相應的假定,就要使用斷言對所做的假定進行檢驗,或者重新編寫**去除假定。

五、assert使用舉例

1、

/* assert example */

#include /* printf */

#include /* assert */

void print_number(int* myint)

int main()

執行結果如下:

2、用asset檢查入口引數

void *memcopy(void *dest, const void *src, size_t len)

體驗這個函式中asset的作用

六、使用者定義自己的巨集assert

以後在更新吧,這裡還沒有看到/寫出很好的**

C語言 巨集 assert()

編寫 時,我們總是會做出一些假設,斷言 assert 就是用於在 中捕捉這些假設,可以將斷言看作是異常處理的一種高階形式。斷言表示為一些布林表示式,程式設計師相信在程式中的某個特定點該表示式值為真。可以在任何時候啟用和禁用斷言驗證,因此可以在測試時啟用斷言,而在部署時禁用斷言。同樣,程式投入執行後,...

C語言 assert巨集的用法

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

C語言的assert巨集的用法

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