前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ASSERT_VALID和ASSERT宏分析[通俗易懂]

ASSERT_VALID和ASSERT宏分析[通俗易懂]

作者头像
全栈程序员站长
发布2022-10-04 13:00:49
8260
发布2022-10-04 13:00:49
举报
文章被收录于专栏:全栈程序员必看

大家好,又见面了,我是你们的朋友全栈君。

这个宏都是MFC的调试宏.

ASSERT_VALID宏用来在运行时检查一个对象的内部合法性,比如说现在有一个学生对象,我们知道每个学生的年龄一定大于零,若年龄小于零,则该学生对象肯定有问题。

事实上,ASSERT_VALID宏就是转化为对象的成员函数AssertValid()的调用,只是这种方法更安全。它的参数是一个对象指针,通过这个指针来调用它的AssertValid()成员函数。

与此相配套,每当我们创建从Cobject类继承而来的一个新的类时,我们可以重载该成员函数,以执行特定的合法性检查

ASSERT_VALID强制调用参数对象(必须是CObject或CObject*)的AssertValid函数,该函数实现对象的内部一致性检查,当你创建一个可重用类时,应该重载这个函数(VC中缺省已经重载了该函数),你可以在该函数中进行必要的检查工作. ASSERT宏用于确保参数内的表达式正确,如果表达式为false,则会显示一个消息对话框,其中有源文件的名字和当前行号,用户可以选择中断程序或进行调试.这个宏通常用于校验参数和返回值. 以上两个宏均只在Debug版本中有效,与ASSERT相对应的是VERIFY.VERIFY宏在Debug版本中与ASSERT相同,在Release版本中仅执行参数表达式,不进行校验.

ASSERT 和 ASSERT_VALID 都是用于Debug的,当括号中的表达式为FALSE时,会弹出对话框通知, 你可以自己加上一句ASSERT(FALSE),看看执行时有什么东东。

ASSERT_VALID用于对C++对象或指针进行有效性判断,如果出错,结果和ASSERT一样。

注意:二者都只能在MFC工程里用。 以下是ASSERT_VALID对应的代码:

#ifdef _DEBUG void AFXAPI AfxAssertValidObject(const CObject* pOb, LPCSTR lpszFileName, int nLine) { if (pOb == NULL) { TRACE(traceAppMsg, 0, “ASSERT_VALID fails with NULL pointer./n”); if (AfxAssertFailedLine(lpszFileName, nLine)) AfxDebugBreak(); return; // quick escape } if (!AfxIsValidAddress(pOb, sizeof(CObject))) { TRACE(traceAppMsg, 0, “ASSERT_VALID fails with illegal pointer./n”); if (AfxAssertFailedLine(lpszFileName, nLine)) AfxDebugBreak(); return; // quick escape }

// check to make sure the VTable pointer is valid ASSERT(sizeof(CObject) == sizeof(void*)); if (!AfxIsValidAddress(*(void**)pOb, sizeof(void*), FALSE)) { TRACE(traceAppMsg, 0, “ASSERT_VALID fails with illegal vtable pointer./n”); if (AfxAssertFailedLine(lpszFileName, nLine)) AfxDebugBreak(); return; // quick escape }

if (!AfxIsValidAddress(pOb, pOb->GetRuntimeClass()->m_nObjectSize, FALSE)) { TRACE(traceAppMsg, 0, “ASSERT_VALID fails with illegal pointer./n”); if (AfxAssertFailedLine(lpszFileName, nLine)) AfxDebugBreak(); return; // quick escape } pOb->AssertValid(); }

在Win32环境下通过测试

#include <afx.h>

class CPerson : public CObject { public:

CPerson(char *pName, int nAge);

#ifdef _DEBUG

virtual void AssertValid() const;

#endif

private:

char *m_strname;

int m_nage; };

CPerson::CPerson(char *pName, int nAge) : m_strname(pName), m_nage(nAge) {

}

#ifdef _DEBUG

void CPerson::AssertValid() const {

CObject::AssertValid();

ASSERT(m_strname);

ASSERT(m_nage>0); }

#endif

int main() {

//CString strName(“listen”);

//CPerson *pPersonOne = new CPerson(strName.GetBuffer(0), -5);

CString strName(“listen”); char *pcstr = (char *)new char[2 * strName.GetLength()+1] ;

WideCharToMultiByte( CP_ACP, 0, strName, // 要转换的wchar_t* -1, pcstr, // 接收char*的缓冲区指针 2 * strName.GetLength()+1, // pcstr的缓冲区的大小 NULL, NULL ); CPerson *pPersonOne = new CPerson(pcstr, 5);

#ifdef _DEBUG

pPersonOne->AssertValid();

#endif

return 0; }

另注:VERIFY就是ASSERT

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年9月6日 下,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档