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

ASSERT_VALID和ASSERT宏分析[通俗易懂]这个宏都是MFC的调试宏. ASSERT_VALID宏用来在运行时检查一个对象的内部合法性,比如说现在有一个学生对象,我们知道每个学生的年龄一定大于零,若年龄小于零,则该学生对象肯定有问题。事实上,ASSERT_VALID宏就是转化为对象的成员函数Asser

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

这个宏都是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

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

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/196668.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 学术应用使用node-http-proxy集成谷歌学术「建议收藏」

    学术应用使用node-http-proxy集成谷歌学术「建议收藏」搞科研的同学肯定离不开谷歌学术,谷歌学术搜索是文献搜索下载一大利器。之前实验室开发了一款学术应用,遗留了历史问题,就是没有解决文献搜索的功能,而这个任务最后落在我的身上。我采用的方案就是集成谷歌学术,但是国内的网络环境,你懂的,自然状态下根本就访问不了谷歌学术的,你得翻墙才能访问。你不能期望使用你开发的学术应用都能翻墙访问谷歌学术(虽然搞科研的人电脑翻墙软件肯定都准备好了!),所以呢我还要给谷歌学术

    2022年8月31日
  • 认识计算机教案_认识计算机硬件教案

    认识计算机教案_认识计算机硬件教案认识计算机教案Tag内容描述:1、第一单元计算机基础知识项目2认识计算机系统【项目目标】了解计算机硬件、软件系统的组成及作用;了解计算机主要部件及其作用;会利用数据存储单位区分存储空间大小;了解计算机主要技术指标及其对性能的影响;理解二进制基本概念及常用数制之间的转换方法;理解ASCII码的基本概念,了解计算机编码规则。任务1认识计算机硬件【任务说明】我们通常看到的微…

    2022年5月3日
  • 宽度学习(BLS)网络的研究和应用[通俗易懂]

    宽度学习(BLS)网络的研究和应用[通俗易懂]宽度学习(BLS)网络的研究和应用  除了上述这几大AI学术研究要点之外,还有宽度学习(BLS)网络也值得重点关注。宽度学习(BLS)自2018年由我们(陈俊龙教授及其团队)首次在学术界提出,便迅速在科研机构(中科院)、国内知名高校及企业展开了较为广泛的研究与应用。  虽然深度学习网络非常强大,但大多数网络都被极度耗时的训练过程所困扰。首先深度网络的结构复杂并且涉及到大量的超参数。另…

    2022年5月11日
  • acwing-1172. 祖孙询问(最近公共祖先)「建议收藏」

    acwing-1172. 祖孙询问(最近公共祖先)「建议收藏」原题链接给定一棵包含 n 个节点的有根无向树,节点编号互不相同,但不一定是 1∼n。有 m 个询问,每个询问给出了一对节点的编号 x 和 y,询问 x 与 y 的祖孙关系。输入格式输入第一行包括一个整数 表示节点个数;接下来 n 行每行一对整数 a 和 b,表示 a 和 b 之间有一条无向边。如果 b 是 −1,那么 a 就是树的根;第 n+2 行是一个整数 m 表示询问个数;接下来 m 行,每行两个不同的正整数 x 和 y,表示一个询问。输出格式对于每一个询问,若 x 是 y 的祖先则输

    2022年8月9日
  • 软件详细设计说明书 模板「建议收藏」

                                             软件详细设计说明书1引言1.1编写目的:阐明编写详细设计说明书的目的,指明读者对象。1.2项目背景:应包括项目的来源和主管部门等。1.3定义:列出本文档中所用到的专门术语的定义和缩写词的愿意。1.4参考资料:  ●列出有关资料的作者、标题、编号、发表日期、出版单位或资料来源  ●项

    2022年4月10日
  • CentOS5.3+Nginx0.7.57+Postfix+Extmail邮件系统安装配置(一))

    CentOS5.3+Nginx0.7.57+Postfix+Extmail邮件系统安装配置(一))

    2021年7月31日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号