C++ assert()函數(shù)用法案例詳解
1. 簡(jiǎn)介
assert宏的原型定義在<assert.h>中,其作用是如果它的條件返回錯(cuò)誤,則終止程序執(zhí)行。
原型定義:
#include <assert.h> void assert( int expression );
assert的作用是先計(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" );//以可寫的方式打開一個(gè)文件,如果不存在就創(chuàng)建一個(gè)同名文件 assert( fp ); //所以這里不會(huì)出錯(cuò) fclose( fp ); fp = fopen( "noexitfile.txt", "r" );//以只讀的方式打開一個(gè)文件,如果不存在就打開文件失敗 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ào)用會(huì)極大的影響程序的性能,增加額外的開銷。在調(diào)試結(jié)束后,可以通過(guò)在包含#include <assert.h>的語(yǔ)句之前插入 #define NDEBUG 來(lái)禁用assert調(diào)用,示例代碼如下:
#include <stdio.h> #define NDEBUG #include <assert.h>
2. 用法總結(jié)與注意事項(xiàng):
1)在函數(shù)開始處檢驗(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ò)濾。
assert是用來(lái)避免顯而易見的錯(cuò)誤的,而不是處理異常的。錯(cuò)誤和異常是不一樣的,錯(cuò)誤是不應(yīng)該出現(xiàn)的,異常是不可避免的。c語(yǔ)言異??梢酝ㄟ^(guò)條件判斷來(lái)處理,其它語(yǔ)言有各自的異常處理機(jī)制。
一個(gè)非常簡(jiǎn)單的使用assert的規(guī)律就是,在方法或者函數(shù)的最開始使用,如果在方法的中間使用則需要慎重考慮是否是應(yīng)該的。方法的最開始還沒(méi)開始一個(gè)功能過(guò)程,在一個(gè)功能過(guò)程執(zhí)行中出現(xiàn)的問(wèn)題幾乎都是異常。
到此這篇關(guān)于C++ assert()函數(shù)用法案例詳解的文章就介紹到這了,更多相關(guān)C++ assert()函數(shù)用法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++11關(guān)于auto關(guān)鍵字的使用示例
今天小編就為大家分享一篇關(guān)于C++11關(guān)于auto關(guān)鍵字的使用示例,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-12-12淺談使用C++多級(jí)指針存儲(chǔ)海量qq號(hào)和密碼
這篇文章主要介紹了淺談使用C++多級(jí)指針存儲(chǔ)海量qq號(hào)和密碼,分享了相關(guān)實(shí)例代碼,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01windows下安裝QT及visual studio 2017搭建開發(fā)環(huán)境
這篇文章主要介紹了windows下安裝QT及visual studio 2017搭建開發(fā)環(huán)境,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03C語(yǔ)言實(shí)現(xiàn)單鏈表反轉(zhuǎn)
這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)單鏈表反轉(zhuǎn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07Qt實(shí)現(xiàn)簡(jiǎn)易毛玻璃效果的示例代碼
這篇文章主要介紹了Qt如何利用模糊功能實(shí)現(xiàn)簡(jiǎn)易的毛玻璃效果,并且鼠標(biāo)可以移動(dòng)無(wú)邊框窗口,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2022-06-06C語(yǔ)言進(jìn)階教程之循環(huán)語(yǔ)句缺陷詳析
循環(huán)語(yǔ)句是用于重復(fù)執(zhí)行某條語(yǔ)句(循環(huán)體)的語(yǔ)句,它包含一個(gè)控制表達(dá)式,每循環(huán)執(zhí)行一次都要對(duì)控制表達(dá)式進(jìn)行判斷,如果表達(dá)式為真,則繼續(xù)執(zhí)行循環(huán),這篇文章主要給大家介紹了關(guān)于C語(yǔ)言進(jìn)階教程之循環(huán)語(yǔ)句缺陷的相關(guān)資料,需要的朋友可以參考下2021-08-08VScode配置cuda開發(fā)環(huán)境的實(shí)現(xiàn)步驟
本文主要介紹了VScode配置cuda開發(fā)環(huán)境的實(shí)現(xiàn)步驟,文中通過(guò)圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-07-07