VC/MFC程序开发中的断言
2005-11-15 12:15
218 查看
首先要确认一点,使用断言可以验证你的程序是否有效,但并不表示你的程序是正确的.
下面开始介绍各种类型断言:
一.C运行时断言:
它声明在:crtdbg.h中,有如下两个断言:
1->_ASSERT(booleanExpression);
2->_ASSERTE(booleanExpression);
其中,_ASSERTE宏显示失效的断言语句,而但它不支持Unicode!
二.MFC库中的断言
1->ASSERT(booleanExpression);
它是MFC中使用最多的断言,在MFC程序设计中,建议使用它!具体原因??----看MFC源代码就知道了:)
2->VERIFY(booleanExpression);
VERIFY宏和ASSERT宏最大的区别是:VERIFY中的布尔表达式在发行版中会被保留下来!这是因为ASSERT只用于DEBUG模式中,而VERIFY可以用于Release模式中!但发问一句:在Release版本中使用断言,你的目的是什么?让用户调试程序?-----建议只使用ASSERT,尽量不使用VERIFY宏
3->ASSERT_VALID(pObjectDeriverdFromCObject);
它用于判定一个指向CObject派生类的对象的指针是否有效,建议在使用CObject派生类的对象之前都要调用ASSERT_VALID宏
4->ASSERT_KINDOF(className,pObjectDerivedFromCObject);
这个宏用来验证指向CObject派生类对象的指针是否从className中派生而来,但它并不检查指针是否有效,因而建议在使用ASSERT_KINDOF宏之前,调用ASSERT_VALID宏
下面是两个没有正式公开的ASSERT宏:
5->ASSERT_POINTER(pointer,pointerType);
它判断指针是否为否,当指针不能为空的时候,使用它
6->ASSERT_NULL_OR_POINTER(pointer,pointerType);
当指针可以为空的时候,使用它
下面介绍一下另外两个有用的函数:
1->BOOL AfxIsValidAddress(const void *memoryAddress,UINT memoryBytes,BOOL isWritable=TRUE);
它用来决定调用进程对于某个给定大小的内存块是否具有读写权限
2->BOOL AfxIsValidString(LPCSTR string,int stringLength=-1);
它用来决定一个调用进程对于某个给定长度的字符串是否具有读权限
什么时候需要断言:
1->检查函数的输入:验证参数.相关数据成员.相关全局变量等等
2->检查函数的输出
3->检查对象的状态:对象是否被正确地初始化等等
4->检查逻辑变量的合理性和一致性
5->检查类中的不变量
参考文档:<<Debugging Windows Programs>>
下面开始介绍各种类型断言:
一.C运行时断言:
它声明在:crtdbg.h中,有如下两个断言:
1->_ASSERT(booleanExpression);
2->_ASSERTE(booleanExpression);
其中,_ASSERTE宏显示失效的断言语句,而但它不支持Unicode!
二.MFC库中的断言
1->ASSERT(booleanExpression);
它是MFC中使用最多的断言,在MFC程序设计中,建议使用它!具体原因??----看MFC源代码就知道了:)
2->VERIFY(booleanExpression);
VERIFY宏和ASSERT宏最大的区别是:VERIFY中的布尔表达式在发行版中会被保留下来!这是因为ASSERT只用于DEBUG模式中,而VERIFY可以用于Release模式中!但发问一句:在Release版本中使用断言,你的目的是什么?让用户调试程序?-----建议只使用ASSERT,尽量不使用VERIFY宏
3->ASSERT_VALID(pObjectDeriverdFromCObject);
它用于判定一个指向CObject派生类的对象的指针是否有效,建议在使用CObject派生类的对象之前都要调用ASSERT_VALID宏
4->ASSERT_KINDOF(className,pObjectDerivedFromCObject);
这个宏用来验证指向CObject派生类对象的指针是否从className中派生而来,但它并不检查指针是否有效,因而建议在使用ASSERT_KINDOF宏之前,调用ASSERT_VALID宏
下面是两个没有正式公开的ASSERT宏:
5->ASSERT_POINTER(pointer,pointerType);
它判断指针是否为否,当指针不能为空的时候,使用它
6->ASSERT_NULL_OR_POINTER(pointer,pointerType);
当指针可以为空的时候,使用它
下面介绍一下另外两个有用的函数:
1->BOOL AfxIsValidAddress(const void *memoryAddress,UINT memoryBytes,BOOL isWritable=TRUE);
它用来决定调用进程对于某个给定大小的内存块是否具有读写权限
2->BOOL AfxIsValidString(LPCSTR string,int stringLength=-1);
它用来决定一个调用进程对于某个给定长度的字符串是否具有读权限
什么时候需要断言:
1->检查函数的输入:验证参数.相关数据成员.相关全局变量等等
2->检查函数的输出
3->检查对象的状态:对象是否被正确地初始化等等
4->检查逻辑变量的合理性和一致性
5->检查类中的不变量
参考文档:<<Debugging Windows Programs>>
相关文章推荐
- VC/MFC程序开发中的断言
- 如何用VC、MFC开发一个尽可能小的程序???
- 基于MFC+VC平台下开发程序问题及技巧综合
- 用vs2010开发基于VC++的MFC串口通信程序2***一台机子的两个串口进行通信****
- 基于VC 6.0 开发的MFC程序如何在文件资源管理器中浏览并选中操作文件
- 如何用VC++开发读取网卡MAC地址的程序
- VB,VC开发OPC客户程序必读!
- VC++/MFC 小程序 文件/目录对话框 递归遍历文件/文件夹
- VC开发指南--Visual C++/MFC入门教程
- vc中,制作在任务栏隐藏图标的mfc程序
- VC++/MFC程序图标更改方法以及修改程序标题 超级简单啦
- VC/MFC 设置程序与文件关联与双击文件获取文件路径
- VC++/MFC(VC6)开发技术精品学习资料分享
- 定时关机程序源代码 VC MFC 权限问题
- 将屏幕保存为图片 将当前MFC程序保存为图片 c++ vc
- 【VC++开发实战】迅雷晒密及批量查询流量程序
- VC MFC程序,在About对话框中获取并显示程序的版本号
- VC,MFC开发技巧收集
- opengl与vc(mfc)开发时的注意点
- VC/MFC中计算程序运行时间