日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

C/C assert()函数用法总结与注意事项

發(fā)布時(shí)間:2023/12/2 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C/C assert()函数用法总结与注意事项 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1. 簡(jiǎn)介

assert宏的原型定義在中,其作用是如果它的條件返回錯(cuò)誤,則終止程序執(zhí)行。

原型定義:

#include?void?assert(?int?expression?);assert的作用是先計(jì)算表達(dá)式?expression?,如果其值為假(即為0),那么它先向stderr打印一條出錯(cuò)信息,然后通過(guò)調(diào)用?abort?來(lái)終止程序運(yùn)行。請(qǐng)看下面的程序清單badptr.c:#include?#include?#include? int main( void ){ ?FILE?*fp; ?//以可寫(xiě)的方式打開(kāi)一個(gè)文件,如果不存在就創(chuàng)建一個(gè)同名文件??fp?=?fopen(?"test.txt",?"w"?);???? //所以這里不會(huì)出錯(cuò)??assert(?fp?);?????????????????????????? ?fclose( fp ); ?//以只讀的方式打開(kāi)一個(gè)文件,如果不存在就打開(kāi)文件失敗 ?fp = fopen( "noexitfile.txt", "r" ); ?//所以這里出錯(cuò)??assert(?fp?);??????????????????????????? ?//程序永遠(yuǎn)都執(zhí)行不到這里來(lái)??fclose(?fp?);??????????????????????????? ?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ì)極大的影響程序的性能,增加額外的開(kāi)銷。在調(diào)試結(jié)束后,可以通過(guò)在包含#include 的語(yǔ)句之前插入 #define NDEBUG 來(lái)禁用assert調(diào)用,示例代碼如下:

#include?#define?NDEBUG#include?


2. 用法總結(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ò)濾。

assert是用來(lái)避免顯而易見(jiàn)的錯(cuò)誤的,而不是處理異常的。錯(cuò)誤和異常是不一樣的,錯(cuò)誤是不應(yīng)該出現(xiàn)的,異常是不可避免的。c語(yǔ)言異常可以通過(guò)條件判斷來(lái)處理,其它語(yǔ)言有各自的異常處理機(jī)制。

?一個(gè)非常簡(jiǎn)單的使用assert的規(guī)律就是,在方法或者函數(shù)的最開(kāi)始使用,如果在方法的中間使用則需要慎重考慮是否是應(yīng)該的。方法的最開(kāi)始還沒(méi)開(kāi)始一個(gè)功能過(guò)程,在一個(gè)功能過(guò)程執(zhí)行中出現(xiàn)的問(wèn)題幾乎都是異常。

來(lái)源:https://blog.csdn.net/linuxguitu/article/details/109688686

總結(jié)

以上是生活随笔為你收集整理的C/C assert()函数用法总结与注意事项的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。