斷言是對某種假設條件進行檢查(可理解為若條件成立則無動作,否則應報告),它可以快速發現並定位軟體問題,同時對系統錯誤進行自動報警。斷言可以對在系統中隱藏很深,用其它手段極難發現的問題進行定位,從而縮短軟體問題定位時間,提高系統的可測性。實際應用時,可根據具體情況靈活地設計斷言。
原型定義:
#include
void assert( int expression_r_r_r );
assert的作用是現計算表示式 expression_r_r_r ,如果其值為假(即為0),那麼它先向stderr列印一條出錯資訊,然後通過呼叫 abort來終止程式執行。
請看下面的程式
#include #include #include int main( void )
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不能代替條件過濾
6)注意事項:
①使用assert的缺點是,頻繁的呼叫會極大的影響程式的效能,增加額外的開銷。
在除錯結束後,可以通過在包含#include 的語句之前插入 #define ndebug 來禁用assert呼叫,示例**如下:
#include
#define ndebug
#include
②assert只有在debug版本中才有效,如果編譯為release版本則被忽略掉。(在c中,assert是巨集而不是函式),使用assert「斷言」容易在debug時輸出程式錯誤所在。
而assert()的功能類似,它是ansi c標準中規定的函式,它與assert的乙個重要區別是可以用在release版本中。
參考文章推薦:華為軟體程式設計規範
C語言斷言
斷言是對某種假設條件進行檢查 可理解為若條件成立則無動作,否則應報告 它可以快速發現並定位軟體問題,同時對系統錯誤進行自動報警。斷言可以對在系統中隱藏很深,用其它手段極難發現的問題進行定位,從而縮短軟體問題定位時間,提高系統的可測性。實際應用時,可根據具體情況靈活地設計斷言。原型定義 include...
C語言斷言
關於斷言的使用,從 林銳的 高質量 c程式設計指南 裡提取了一段斷言的使用規 則 程式一般分為 debug 版本和 release 版本,debug 版本用於內部除錯,release 版本發行給使用者使用。斷言 assert 是僅在 debug 版本起作用的巨集,它用於檢查 不應該 發生的情況。規則...
C語言斷言assert詳解
assert巨集的原型定義在中,其作用是如果它的條件返回錯誤,則終止程式執行,原型定義 void assert int expression assert的作用 是現計算表示式 expression 如果其值為假 即為0 那麼它先向stderr列印一條出錯資訊,然後通過呼叫 abort 來終止程式執...