C 語言assert使用

2022-07-27 08:39:11 字數 1251 閱讀 9302

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

#include 

void assert( int expression );

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

2、使用assert的缺點是,頻繁的呼叫會極大的影響程式的效能,增加額外的開銷。在除錯結束後,可以通過在包含#include 的語句之前插入 #define ndebug 來禁用assert呼叫,示例**如下:

#include 

#define ndebug

#include 

3、一些建議:

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

3.2、在函式的入口處,使用斷言檢查引數的有效性(合法性)。

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

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

4、乙個例子:

char   *   clone_string(const   char   *   source)

char   *   result;

assert(source   !=   null);

result   =   (char   *)malloc(strlen(source)   +   1);

if   (result   !=   null)

strcpy(result,   source);

assert(strcmp(result,   source)   ==   0);

return   result;

注意到我對source是否為null是用assert檢查的,但對result是不是為null是用if語句判斷的,這是因為在呼叫**正確的情況下source必然不為null,如果斷言失敗,說明呼叫**中有錯誤,需要修改;但result作為malloc的返回值則不一定,在malloc**無誤的情況下仍然可能返回null——當記憶體塊不足時。最後又用assert對strcpy的結果進行檢查,因為只要**正確,無論什麼情況strcpy應該正常完成複製,它沒有malloc那種異常情況存在。

C語言中assert的使用

assert巨集的原型為 1 include 2 void assert int expression 作用為計算expression,若其值為假 0 先向stderr列印一條出錯資訊,後呼叫abort來終止程式執行!一般除錯階段使用assert,除錯結束後可以通過在 include的語句之前插入 ...

C語言ASSERT巨集

一 assert函式的目的 斷言可以對在系統中隱藏很深,用其它手段極難發現的問題進行定位,並且輸出資訊很詳細,可以很好地解決大多數c語言編譯器錯誤資訊輸出不詳細的問題 二 assert巨集的原型,assert在 定義的 c語言中,assert斷言的原型定義在檔案中。assert是乙個巨集定義,並不是...

C語言 巨集 assert()

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