linux系統(tǒng)下如何使用assert函數(shù)?
只要看得懂程序的人都知道assert,在Windows下使用VC編寫(xiě),使用assert之后,只需在IDE中設(shè)置為debug版或者是release版,編譯器就會(huì)自動(dòng)忽略掉assert。但是在Linux下,必須要在編譯命令中加入-DNDEBUG中,系統(tǒng)編譯時(shí)才不會(huì)將assert編譯進(jìn)去。不然,程序運(yùn)行時(shí)有可能會(huì)被assert中斷。那linux系統(tǒng)下如何使用assert函數(shù)呢?下面就和大家說(shuō)一下linux系統(tǒng)下使用assert函數(shù)的方法。

步驟如下:
assert宏的原型定義在《assert.h》中,其作用是如果它的條件返回錯(cuò)誤,則終止程序執(zhí)行,原型定義:
#include 《assert.h》
void assert( int expression );
assert的作用是現(xiàn)計(jì)算表達(dá)式 expression ,如果其值為假(即為0),那么它先向stderr打印一條出錯(cuò)信息,
然后通過(guò)調(diào)用 abort 來(lái)終止程序運(yùn)行。
請(qǐng)看下面的程序清單badptr.c:
#include 《stdio.h》
#include 《assert.h》
#include 《stdlib.h》
int main( void )
{
FILE *fp;
fp = fopen( “test.txt”, “w” );//以可寫(xiě)的方式打開(kāi)一個(gè)文件,如果不存在就創(chuàng)建一個(gè)同名文件
assert( fp ); //所以這里不會(huì)出錯(cuò)
fclose( fp );
fp = fopen( “noexitfile.txt”, “r” );//以只讀的方式打開(kāi)一個(gè)文件,如果不存在就打開(kāi)文件失敗
assert( fp ); //所以這里出錯(cuò)
fclose( fp ); //程序永遠(yuǎn)都執(zhí)行不到這里來(lái)
return 0;
}
[root@localhost error_process]# gcc badptr.c
[root@localhost error_process]# 。/a.out
a.out: badptr.c:14: main: Assertion `fp‘ failed.
已放棄
使用assert的缺點(diǎn)是,頻繁的調(diào)用會(huì)極大的影響程序的性能,增加額外的開(kāi)銷(xiāo)。
在調(diào)試結(jié)束后,可以通過(guò)在包含#include 《assert.h》的語(yǔ)句之前插入 #define NDEBUG 來(lái)禁用assert調(diào)用,示例代碼如下:
#include 《stdio.h》
#define NDEBUG
#include 《assert.h》
用法總結(jié)與注意事項(xiàng):
1)在函數(shù)開(kāi)始處檢驗(yàn)傳入?yún)?shù)的合法性
如:
int resetBufferSize(int nNewSize)
{
//功能:改變緩沖區(qū)大小,
//參數(shù):nNewSize 緩沖區(qū)新長(zhǎng)度
//返回值:緩沖區(qū)當(dāng)前長(zhǎng)度
//說(shuō)明:保持原信息內(nèi)容不變 nNewSize《=0表示清除緩沖區(qū)
assert(nNewSize 》= 0);
assert(nNewSize 《= MAX_BUFFER_SIZE);
。。。
}
2)每個(gè)assert只檢驗(yàn)一個(gè)條件,因?yàn)橥瑫r(shí)檢驗(yàn)多個(gè)條件時(shí),如果斷言失敗,無(wú)法直觀的判斷是哪個(gè)條件失敗
不好: assert(nOffset》=0 && nOffset+nSize《=m_nInfomationSize);
好: assert(nOffset 》= 0);
assert(nOffset+nSize 《= m_nInfomationSize);
3)不能使用改變環(huán)境的語(yǔ)句,因?yàn)閍ssert只在DEBUG個(gè)生效,如果這么做,會(huì)使用程序在真正運(yùn)行時(shí)遇到問(wèn)題
錯(cuò)誤: assert(i++ 《 100)
這是因?yàn)槿绻鲥e(cuò),比如在執(zhí)行之前i=100,那么這條語(yǔ)句就不會(huì)執(zhí)行,那么i++這條命令就沒(méi)有執(zhí)行。
正確: assert(i 《 100)
i++;
4)assert和后面的語(yǔ)句應(yīng)空一行,以形成邏輯和視覺(jué)上的一致感
5)有的地方,assert不能代替條件過(guò)濾
上述也就是linux系統(tǒng)下使用assert函數(shù)方法的全部?jī)?nèi)容了。如你還不知道在linux系統(tǒng)下如何使用assert函數(shù)的,不妨請(qǐng)你先看看上述的內(nèi)容啊!看完了你也就知道怎么使用assert函數(shù)了。有興趣的用戶(hù)可以去來(lái)了解一下。
相關(guān)文章:
1. Win8系統(tǒng)無(wú)線(xiàn)網(wǎng)絡(luò)服務(wù)怎么開(kāi)啟?Win8系統(tǒng)開(kāi)啟無(wú)線(xiàn)網(wǎng)絡(luò)服務(wù)的方法2. 處理win10全面戰(zhàn)爭(zhēng)幕府將軍2打不開(kāi)的方法3. 如何從Windows 10升級(jí)到Windows 11?Win10升級(jí)到Win11的正確圖文步驟4. SCO Unix 系統(tǒng)下網(wǎng)卡的安裝及故障排除5. Windows注冊(cè)表應(yīng)用的30個(gè)實(shí)例6. win7系統(tǒng)中提示未授予用戶(hù)在此計(jì)算機(jī)上的請(qǐng)求登錄類(lèi)型的具體處理方法7. win8.1升級(jí)win10出現(xiàn)modern setup host停止工作怎么辦?8. win7任務(wù)欄風(fēng)格更改教程9. win101803更新升級(jí)190960%失敗怎么辦10. Windows Vista:微軟的一個(gè)新神話(huà)?

網(wǎng)公網(wǎng)安備