釣魚累了,寫下斷言怎么用
時間:2021-10-20 16:27:21
手機看文章
掃描二維碼
隨時隨地手機看文章
[導讀][導讀]大家好,我是逸珺。今天來分享整理如何正確的使用斷言。何為斷言斷言一般是用于檢測在某個程序位置程序必須滿足某些條件的宏。一般用的多的可以分兩種種情況:前置條件:在某個程度點開始的地方后置條件:在某段程序執(zhí)行結(jié)束后,一般用于檢測執(zhí)行結(jié)果斷言發(fā)生表示程序中存在錯誤。因此,斷言是...
[導讀] 大家好,我是逸珺。今天來分享整理如何正確的使用斷言。 —— The End?——
何為斷言
斷言一般是用于檢測在某個程序位置程序必須滿足某些條件的宏。一般用的多的可以分兩種種情況:- 前置條件:在某個程度點開始的地方
- 后置條件:在某段程序執(zhí)行結(jié)束后,一般用于檢測執(zhí)行結(jié)果
#define?assert(test)?((test)???(void)?0?:?abort())
也可以編程者自己定義,比如:#define?assert(arg)?{?if(?!(arg)?)?{?printf("assert?in?File="__FILE__"?Line=%d?",__LINE__);?return;?}?}
該怎么用
前置條件
比如某一個函數(shù)代碼:#define?ALLOWED_SIZE??(1024)
int?func(int?size,?char?*buffer?)?
{
??assert(?size?<=?ALLOWED_SIZE?);
??assert(?format?!=?NULL?);
??...
}
這個函數(shù)里,使用了兩次斷言判斷函數(shù)執(zhí)行的前置條件:- size必須要不大于ALLOWED_SIZE,func函數(shù)才真正執(zhí)行其任務。因此,如果輸入的size超過1024,func不會做任何處理。
- buffer傳入的地址必須不是NULL,否則func函數(shù)不會執(zhí)行。
后置條件
后置條件斷言一般是指判斷函數(shù)的執(zhí)行結(jié)果。比如:int?func(int?size,?char?*buffer?)?
{
?int?result;
?
?/*中間處理部分更新這個返回值*/
??...
??
??assert(?result?<=?ALLOWED_SIZE?);
??return?result;
}
這樣寫表示這個函數(shù)的返回值永遠不會大于ALLOWED_SIZE。如果大于了,就證明產(chǎn)生錯誤了。什么時候用
斷言的最常用和最有效的用途是檢查前置條件——即指定和檢查函數(shù)的輸入條件。兩個非常常見的用途:- 指針不是 NULL。
- 索引和邊界范圍值是在設計的合理范圍之類。
- 如果在程序測試和調(diào)試期間違反了前置條件,也就是說斷言異常了,則調(diào)用包含前置條件的函數(shù)的代碼中存在bug。
- 如果在程序測試和調(diào)試期間違反了后置條件,則該斷言前面部分代碼可能有bug。
- 程序錯誤是一個bug,永遠不應該發(fā)生。
- 運行時錯誤可能在程序執(zhí)行期間的任何時間發(fā)生。
int?main(int?argc,?char?*argv[])
{
????QVector?<int>?list;
????list.append(0);
????list.append(1);
????qDebug()?<list.at(2);
????
????return?0;
}
一運行,就會有這樣的結(jié)果:ASSERT?failure?in?QVector::at:?"index?out?of?range",?file?C:\Qt\Qt5.7.1\5.7\mingw53_32\include/QtCore/qvector.h,?line?429
assert?in?File=..\src\main.cpp?Line=4
因為list只有兩個元素,list.at(2)則是去訪問第3個,顯然訪問的元素不存在,所以就斷言了。