您好,欢迎访问三七文档
浅析调试宏安晓倩2009.08.05这两个宏在Debug环境下特别有效,常用于代码的跟踪调试。VERTY和ASSERT都是MFC中常用的宏。他们的语法格式相同ASSERTASSERT(booleanExpression)booleanExpression为一个表达式(包括指针值),表达式的值为0或非0。主要用于确保一个假设的正确性说明:ASSERT宏在MFC的编译阶段,如果booleanExpression的值为0,则输出一个诊断信息并中断程序,诊断消息的形式为:assertionfailedinfilenameinlinenum其中name是源文件名,num是源文件中运行失败的中断号。如果非0,则不作任何处理。在MFC的发布阶段(即在Release版中),ASSERT不计算booleanExpression的值,因此也就不会中断程序。如果booleanExpression无论在什么条件下都需要计算,则应该用VERIFY。这个宏通常原来判断程序中是否出现了明显非法的数据,如果出现了终止程序以免导致严重后果,同时也便于查找错误。要注意的是有时使用ASSERT()时,会产生一些问题:如:ASSERT(i++3);上面语句在Debug模式和Release模式会使程序有不同的结果。由于后者没有执行该语句,所以变量i还是ASSERT()前的值。前者则相反。它主要是监视程序在调试运行的过程中的运行情况,多多使用它,绝对有好处,没有一点坏处。注意ASSERT()使用的时候必须保证参数表达式中不能有函数调(ASSERT()宏在Release版本中不对表达式求值),因此对于任何有函数调用的参数表达式,应该使用宏VERIFY(),以保证表达式中的函数调用在Release版本中会被正确求值。VERIFYVERIFY(booleanExpression);VERITY宏在MFC的编译阶段,如果booleanExpression的值为0,则输出一个诊断信息并且暂停程序,如果非0,则不作任何处理。在MFC的发布阶段(即在Release版中),VERITY计算booleanExpression的值,但是并不输出诊断信息或是中断程序。1.ASSERT是专门为DEBUG版使用的。Release版本可以用VERIFY替代。2.VERIFY()和ASSERT()很相似,区别在于在Release版本中它仍然有效补充:ASSERT_VAILDASSERT_VAILD(pObject)用于检测关于对象的内部状态的有效性。ASSERT_VALID调用此对象的AssertValid成员函数(把它们作为自己的变量来传递)。在Release版中ASSERT_VALID什么也不做。在DEBUG版中,他检查指针,以不同于NULL的方式进行检查,并调用对象自己的AssertValid成员函数。如果这些检测中有任何一个失败的话,那么他会以与ASSERT相同的方法显示一个警告的消息。MFC使用ASSERT_VALID来强行调用一个Object的AsserValid函数。只要一个函数的参数是一个有效的CObject或CObject指针,这个函数就会使用ASSERT_VALID来验证这个Object。ASSERT_VALID和ASSERT一样,都是只有在Debug模式下才有效。程序示例如下:CShapsDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);
本文标题:浅析调试宏
链接地址:https://www.777doc.com/doc-2311350 .html