斷言
斷言可以對在系統中隱藏很深,用其它手段極難發現的問題進行定位,并且輸出信息很詳細,可以很好地解決大多數C語言編譯器錯誤信息輸出不詳細的問題。
斷言是對某種條件進行檢測,若條件成立則無反應,否則程序執行到斷言處終止,同時輸出為成立的條件。
asrt是一個宏定義,并不是函數。
如
#include <asrt.h>//asrt所在頭文件
void main()
{
int i = 9;
asrt(i == 0);
}
則程序輸出如下:
Asrtion failed!
Program: E:C _asrt.exeFile: E:C _asrt.c, Line 8Expression: i == 0
This application has requested the Runtime to terminate it in an unPlea contact the application's support team for more information.
經常調用斷言,會極大地增加程序的開銷,可以通過以下方法使斷言機制,使只在debug下,使用斷言機制。
這種情況下,不要包含頭文件 asrt.h
#ifndef NDEBUG
#define asrt(exp) ((void)0)#el#define asrt(exp) (void)( (exp) || (_asrt(#exp, __FILE__, __LINE__), 0) )
在沒有定義 NDEBUG下,asrt被定義為 (void)0,無意義語句,而且對程序沒有什么影響。
在定義NDEBUG時,斷言會輸出 不成立的條件 和 語句所在文件和行,所以我們可以在debug時,在上述代碼之前,定義 NDEBUG ,在程序作為成品交出時, 刪除NDEBUG的宏定義。
使用原則一個斷言只能檢測一個條件。 斷言檢查只是輔助條件,不能替代條件檢測 不能使用改變環境語句的使用。頻繁使用斷言也會降低效率。并且它的強制停止所以不適合嵌入式程序和服務器,但也可以改寫只報錯誤而不停止,即不調用abort()。不要浪費別人的時間—詳細說明不清楚的斷言;消除所做的隱式假定,或者利用斷言檢查其正確性例如:有時候我們會不自覺的認為一個字節占8位,或者說一個long型占據4個字節,這些都是對編譯程序或操作系統做的一些假定。這使得我們需要在程序中使用斷言例如ASSERT(sizeof(long)==4&&CHAR_BIT==8)。斷言是進行調試檢查的簡單方法。要使用斷言來檢查絕對不應該發生的非法情況,不要混淆非法情況和錯誤情況,錯誤情況是需要在最終產品中處理的。利用斷言對函數的參數進行確認,并且當程序員使用了無定義特性時向程序員報警。當編寫函數時,應反復問自己做了哪些假定,一旦確定了相應的假定,就要使用斷言對所做的假定進行檢驗,或者重新編寫代碼去除假定。最后初學者有什么不懂的可以私信我,需要系統學習資料和系統學習框架圖的同學,可關注小編頭條號,歡迎留言評論和私信小編。【私信方法】文章上方處點擊“作者頭像”,進入作者首頁,在作者主頁上方點擊“關注”旁邊的“發私信”即可。私信內容:學習幫助。
喜歡小編的文章的朋友可以關注、收藏、轉發、留言。祝大家閱讀愉快!!
本文發布于:2023-02-28 20:14:00,感謝您對本站的認可!
本文鏈接:http://m.newhan.cn/zhishi/a/167766445082272.html
版權聲明:本站內容均來自互聯網,僅供演示用,請勿用于商業和其他非法用途。如果侵犯了您的權益請與我們聯系,我們將在24小時內刪除。
本文word下載地址:debug assertion failed(debug assertion failed怎么解決mfc).doc
本文 PDF 下載地址:debug assertion failed(debug assertion failed怎么解決mfc).pdf
| 留言與評論(共有 0 條評論) |