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