在VC++中使用斷言

news/2024/7/3 21:11:50

VC++中使用斷言

1??????? 斷言的表達形式

1.1????? 語法

斷言是一個宏,格式為: ASSERT( 邏輯表達式 booleanExpression)

邏輯表達式可以是任意一個表達式,其值是0或者非0。

從代碼的可讀性角度來講,這個表達式應該是不包含與布爾型變量的邏輯比較操作的。

1.2????? 作用

斷言僅僅在Debug過程中產生作用。

當邏輯表達式出現了FALSE(0)的時候,編譯程序將自動停止程序的運行,並給出相關的程序診斷信息。

對於Release版本的代碼,ASSERT宏不會被處理,因而不會對程序的正常運行其任何阻攔作用。對於MFC,假如希望在Release版本中依然有類似的功能,可以使用VERIFY宏。該宏作用和斷言類似。

1.3????? 診斷信息

assertion failed in file in line

以上為診斷信息的格式。其中file name代表了出錯程序代碼所在的文件,line number是該出現問題的斷言所在行。

2??????? 斷言的使用方法

2.1????? 函數調用正確性檢查

可以檢查函數參數的合理性。

在實際工作中,有些函數需要輸入參數滿足一些假定條件,而這些約束條件不是數據類型可以滿足的。比如下面的代碼,要根據三個邊長求一個直角三角形的某些參數,必須確認這三個邊長是合理的。

Type GetValue(int a, int b, int c)

{

??? ASSERT( (a <= c) && (b <= c) ) //specify the third parameter as the largest

??? ASSERT( (a * a + b * b) == c*c )

??? //To do something

………

//End function

}

在這裡,斷言第三個參數必須是最大的邊長,之後,進一步要求兩個短邊的平方和必須等於長邊的平方。

類似的,我們可以用判斷主調給出的指針是否有效。

……

ASSERT(NULL != pOutBuffer)

…...

在函數內檢測參數的合理性有兩個好處:

1 保證函數本身的健壯性;

2 使問題容易定位。

主調給出的參數有時候可能是莫名其妙的,使用斷言,能夠發現許多難以發現的邏輯錯誤。

2.2????? 檢查內存分配

MFC中,由於windows的虛擬內存,Release以後的程序是不可能耗盡內存的。因此,如果用普通代碼檢查分配內存成功與否,效率是不合算的,最好使用斷言。

例如:

……

pBuf = (char *) malloc( sizeof(char) * 100 );

ASSERT( NULL != pBuf )

……

這樣既不降低碼執行效率,又能檢查分配內存是否成功。

2.3????? 防治野指針

大概在定義指針的時候人人都懂得初始化吧:

int *pCount = NULL;

然後分配空間,

pCount = new int[ 10 ];

 process…

? 之後釋放空間:

 delete []pCount;

 這時候,pCount指向哪裡呢? 還是原來的地址,然而改地址已經被系統釋放了,於是這個指針就變成了野指針”,如果使用,必然導致錯誤。在這裡,應該使用斷言來確保賦了NULL值。

 pCount = NULL;

? ……

? ASSERT ( NULL == pCount ); //if you’ve forgotten delete,here will output an alart.

? 牢記,在給一個指針釋放空間之後用斷言確保這個指針已經賦了NULL,以免出現野指針。

2.4????? MSDN範例

// example for ASSERT
   
   
CAge* pcage = new Cage[ 21 ]; // CAge is derived from CObject.
   
ASSERT( pcage!= NULL )
   
ASSERT( pcage->IsKindOf( RUNTIME_CLASS( CAge ) ) )
   
// Terminates program only if pcage is NOT a CAge*.
   

以上為MSDN中對於斷言使用的範例,在這裡確保了pcage指向的對象是有效的Cage類。

3??????? 注意事項

1 斷言捕捉的是非法操作的情況,而不是錯誤。不要試圖用斷言來排錯。

2 一旦函數對參數有任何假定,一定要在函數的入口處使用斷言來確認假定是否實現。

3 給每一個斷言加上注釋,以便使斷言有目的的防錯。

?

參考資料

1 Steve Maguire, Writing Clean Code.

2林銳,高質量C/C++編程指南

3 Microsoft,MSDN document

?

V1.0 2003/9/9





http://www.niftyadmin.cn/n/3655249.html

相关文章

计算机常见文件类,关于文件类型电脑文件常用的有哪些类型?对应的软件有什么?rmvb 爱问知识人...

正确的安装步骤&#xff1a;首先进入BIOS设置光驱优先。1)首先按Del键进入BIOS2)通过键盘上的方向键选中Advanced BIOS Features3)回车进入BIOS设置界面4)用方向键选中First Boot Device或(1st Boot Device)5)用上下方向键选中CDROM6)按ESC返回BIOS设置界面。7)方向键选中Save …

探讨CtreeCtrl::SortChildrenCB

探讨CtreeCtrl::SortChildrenCB在实际开发中&#xff0c;我们往往需要对树控件&#xff08;CTreeCtrl&#xff09;的节点进行排序。事实上&#xff0c;大部分的排序工作可以用CTreeCtrl::SortChildren来实现&#xff0c;不过CTreeCtrl::SortChildren是简单的通过树项目名称排序…

计算机辅助干预会议,我系一篇论文被MICCAI 2019(国际医学图像计算和计算机辅助干预会议)录用...

近日&#xff0c;国际医学图像计算和计算机辅助干预会议MICCAI2019 (International Conference on Medical Image Computing and Computer Assisted Intervention, MICCAI)录用结果公布&#xff0c;我系唐晓颖助理教授课题组有一篇论文被接收。MICCAI是由国际医学图像计算和计算…

用纯粹的C++编写COM组件

赵湘宁下载本文代码本文提供一个完全用C实现的进程内&#xff08;DLL&#xff09;COM服务器&#xff0c;不要ATL或MFC提供任何支持。用这种方式编写COM对象可以让你深入地洞察到COM处理进程内服务器的方法以及COM是如何创建类工厂的。利用本文提供的这个简单框架你可以实现很基…

计算机基础结构,计算机基础知识(系统结构够造)

《计算机基础知识(系统结构够造)》由会员分享&#xff0c;可在线阅读&#xff0c;更多相关《计算机基础知识(系统结构够造)(2页珍藏版)》请在人人文库网上搜索。1、计算机系统是由数量和品种繁多的部件组成的。各种部件技术内容十分丰富&#xff0c;主要有运算与控制技术、信息…

网络程序设计 Sockets

关于Socket编程&#xff0c;在《Linux从入门到精通》里有简单的介绍&#xff0c;更详细的可以参考《UNIX网络编程 卷1&#xff1a;联网的API:套接字与XTI 第2版》清华影印版&#xff0c;其中还讲了线程(Thread)编程。极好的参考书&#xff0c;可惜没人把它翻译过来。胡淑瑜翻译…

显示出现计算机代码,电脑出现蓝屏并提示代码:c0000218 的原因分析

“STOP:c0000218 {Registry File Failure}”是一个很典型的错误信息&#xff0c;造成错误的塬因是硬盘错误或硬盘损坏。解决办法如下&#xff1a;1. 从 Windows XP 光盘启动计算机。如果出现提示&#xff0c;请选择从光盘启动计算机必须选择的任何选项。2. 当提示你选择“修复或…

用Socket和MSHTML对象模型创建自己的浏览器

用Socket和MSHTML对象模型创建自己的浏览器中央财经大学管理信息系 薛 瑛 01-4-20 上午 11:15:22HTTP协议和WEB浏览器的诞生给我们的网络增加了更多的精彩。但在实际应用中我们可能会有不同的需要而不是单纯的使用浏览器&#xff0c;譬如在我们的应用程序中加入浏览互联网的功能…