1 作用:
斷言常做語言處理的高級形式,自動處理軟件隱藏很深其且它手段不易發現的錯誤,快速進行異常定位。同時這也是軟件單元測試必須的技術。
2 使用范圍:
2.1放在函數入口對入口參數進行合法性檢查(這也是我們經常看到的)
2.1將assert(0)放在預計正常情況不會出現的地方(一旦出現肯定是異常出錯了)
2.3放在前置條件必須滿足、后置條件必須滿足、不變條件必須滿足的場合
3 使用原則:
3.1一個斷言只能檢測一個條件。
3.2 斷言檢查只是輔助條件,不能替代條件檢測
3.3 不能使用改變環境語句的使用。
3.4可以用開關條件編譯來打開或者關閉斷言,一般在debug模式打開而在release模式下關閉。
ifndef NDEBUG
assert( conditon ) ;
#endif
3.5頻繁使用斷言也會降低效率。並且它的強制停止所以不適合嵌入式程序和服務器,但也可以改寫只報錯誤而不停止,即不調用abort()。
3.6不要浪費別人的時間—詳細說明不清楚的斷言;消除所做的隱式假定,或者利用斷言檢查其正確性例如:有時候我們會不自覺的認為一個字節占8位,或者說一個long型占據4個字節,這些都是對編譯程序或操作系統做的一些假定。這使得我們需要在程序中使用斷言例如ASSERT(sizeof(long)==4&&CHAR_BIT==8)。
3.7斷言是進行調試檢查的簡單方法。要使用斷言來檢查絕對不應該發生的非法情況,不要混淆非法情況和錯誤情況,錯誤情況是需要在最終產品中處理的。
3.71利用斷言對函數的參數進行確認,並且當程序員使用了無定義特性時向程序員報警。
3.72當編寫函數時,應反復問自己做了哪些假定,一旦確定了相應的假定,就要使用斷言對所做的假定進行檢驗,或者重新編寫代碼去除假定。
4靜態斷言與普通斷言:
靜態斷言可以在編譯時就對程序的錯誤做出判斷,而普通斷言只能在程序運行出現錯誤的時候做出退出並產生調試信息
static_assert(condition,string_condition);
第一次參數是表達式,第二個參數是輸出的信息
static_assert()是C++ 新增的內容
在C語言里可以這樣實現:
#define JOIN( X , Y ) JOIN_AGIN( X, Y )
#define JOIN_AGIN(X,Y) X##Y
typedef static_assert(e)\
typedef char JOIN(assert_failed_at_line,__LINE___) [(e)?1:-1]