您的位置:首页 > 其它

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>>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: