斷言assert原型
void assert(int expression);
assert宏的原型定義在<assert.h>中,其作用是先計算表達式expression的值為假(即為0),那么它就先向stderr打印一條出錯信息,然后通過條用abort來終止程序;
使用assert的缺點是,頻繁的調(diào)用會極大的影響程序的性能,增加額外的開銷。
在調(diào)試結(jié)束后,可以通過在包含#include 的語句之前插入 #define NDEBUG 來禁用assert調(diào)用,示例代碼如下:
1 #include
2 #define NDEBUG
3 #include
斷言assert使用規(guī)則
#include <stdio.h>
#include <assert.h>
int main(void)
{
int i;
i = 1;
assert(i++);
printf(“%d\n”,i);
return 0;
}
看運行結(jié)果,如果給定的i初始值為1,所以其運行結(jié)果不會為錯,如下圖所示
如果將i初始值改成0,那么就會出現(xiàn)如下錯誤:
上面這個錯誤是很典型異常,可以考慮用assert排查。
根據(jù)提示我們很快就能定位到錯誤點,就在assert(i++)處;既然assert這么便于定位出錯點,在工程中使用它就顯得很有必要;但其也有一定的使用規(guī)則;
斷言語句不會永遠被執(zhí)行,可以屏蔽也可以啟用,這就要求assert不管是在屏蔽還是啟用狀態(tài)下都不能對我們本身代碼有所影響,這樣剛才我們在代碼中使用的assert(i++)
就不行,因為如果禁用了assert
,那i++就不能執(zhí)行;正確的做法應該是:assert(i);i++;
那么我們一般在什么情況下使用斷言呢?
主要體現(xiàn)在以下幾個方面:
-
前置條件:代碼執(zhí)行前必須具備的特性; -
后置條件:代碼執(zhí)行后必須具備的特性;
斷言assert使用規(guī)則
當然我們在使用斷言的過程中會有一些我們應該注意的事項和養(yǎng)成一些良好的習慣,如:
無法直觀的判斷哪個條件失?。?/p>
assert(nOffset>=0 && nOffset+nSize<=m_nInfomationSize);
只檢驗一個條件,比較直觀:
assert(nOffset >= 0);
assert(nOffset+nSize <= m_nInfomationSize);
例如:
assert(i++ < 100)
不好:這是因為如果出錯,比如在執(zhí)行之前i=100,那么這條語句就不會執(zhí)行,那么i++這條命令就沒有執(zhí)行。
assert(i < 100)
i++;
正確。
程序一般分為Debug 版本和Release 版本,Debug 版本用于內(nèi)部調(diào)試,Release 版本發(fā)行給用戶使用。斷言assert 是僅在Debug 版本起作用的宏,它用于檢查"不應該"發(fā)生的情況。
int resetBufferSize(int nNewSize)
{
//功能:改變緩沖區(qū)大小,
//參數(shù):nNewSize 緩沖區(qū)新長度
//返回值:緩沖區(qū)當前長度
//說明:保持原信息內(nèi)容不變 nNewSize<=0表示清除緩沖區(qū)
assert(nNewSize >= 0);
assert(nNewSize <= MAX_BUFFER_SIZE);
...
}
在我們使用C語言/C++做工程項目時,如果我們能在代碼中合理的使用assert,能使我們創(chuàng)建更穩(wěn)定、質(zhì)量更好且不易于出錯的代碼;當需要在一個值為FALSE時中斷當前操作的話就可以使用斷言。
單元測試必須使用斷言;另外除了類型檢查和單元測試外,斷言還提供了一種確定各種特性是否在程序中得到維護的極好的方法;
最近原創(chuàng)推薦:
serif;font-size: 16px;text-align: left;background-color: rgb(255, 255, 255);line-height: 26px;box-sizing: border-box !important;overflow-wrap: break-word !important;"> 一文輕松理解內(nèi)存對齊
點【在看】是最大的支持
免責聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺僅提供信息存儲服務。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!