vc中ASSERT()和VERIFY()区别

(2010-03-27 22:24:53)

转载
标签:

杂谈

 

1  ASSERT与VERIFY宏在Debug模式下作用基本一致,二者都对表达式的值进行计算,如果值为非0,则什么事也不做;如果值为0,则输出诊断信息。  
2  ASSERT与VERIFY宏在Release模式下效果完全不一样。ASSERT不计算表达式的值,也不会输出诊断信息;VERIFY计算表达式的值,但不管值为0还是非0都不会输出诊断信息。

断言(assertion)用带断言信息(程序, 模块, assertion行)的对话框执行. 对话框有3个按钮:"Break", "Repeat" ("Debug"), and "Continue" ("Ignore"). "Break"结束程序, "Continue" 忽略断言, 最有用的是"Repeat"按钮. 按下它在断言的地方打开源代码编辑器.在这里你可以测试所有的变量值并明白哪里出了问题。
例如:ASSERT(pPointer);ASSERT(n>0&&n<100);ASSERT(0);
ASSERT在执行简单验证时很有用,但对于C++对象,特别是由CObject派生的对象,则有更好的方法ASSERT_VALID来实现类似操作。作为一般规则,我们应在开始使用每一个对象之前检查数据讹误,
ASSERT_VALID宏使得对CObject的派生类实现该操作非常简单。
例如:ASSERT_VALID(this);ASSERT_VALID(pView);
VERIFY()
    VERIFY()和ASSERT()很相似,区别在于在 Release版本中它仍然有效(译者注:原作者在这里没有讲清楚,VERIFY()不会打印说明,只是会对参数表达式求值)。
TRACE()
   TRACE()基本上就是函数 printf()的一个复制品,唯一的区别是它把结果输出到调试窗口。在 Release版本中,它也是无效的。一般是用TRACE0(),TRACE1(),TRACE2()…而不用TRACE()。
? 这三个宏在 Release 版本中都不会产生任何实质性的影响,它们是否起作用取决于是否定义了预定义了宏 _DEBUG。这是对Microsoft Visual C++ 而言,在其它的编译器中可能其它不同的宏。
常用用法:
为了控制传进的指针:
void SomeFun(SomeType* pPointer)
{
  ASSERT(pPointer);
 //some instructions.
}
你可以在"switch" 和 "if"操作中捕获奇怪的值
例如:
switch(nRGBColors){
  case nRed:  {//someinstructions.} break;
  case nGreen: {//some instructions.} break;
  case nBlue:  {//someinstructions.} break;
  default:ASSERT(0);    //we should have never come here!
}
if(nWaterTemp >=0 &&nWaterTemp < 50){
  //some instructions.
}
else if(nWaterTemp >= 50&& nWaterTemp <=100){
  //some instructions.
}
else{
 ASSERT(0);    //we should have never come here!
}
对值的断言:
ASSERT(nSomeValue >= MinValue and nSomeValue<= MaxValue);
ASSERT(nOtherValue != 0);
 
可爱的 ASSERT 错误
ASSERT( m_MyWnd.Create() );
呕! 这是一个可怕的错误! 程序在调试版中正常工作, 在发行版中不工作. 记住: 这是一个在发行版中将被移除的宏.以这种方法你的窗口将永远不会被创建. 如果你用 MFC, 这样做:
VERIFY( m_MyWnd.Create() );
它在调试版中像ASSERT一样并且在发行版中执行m_MyWnd.Create()。

vc中ASSERT()和VERIFY()区别相关推荐

  1. VC中_T()与L区别(转)

    VC中_T("")与L区别 区别解释 一说这个话题,肯定涉及MS的字符集,先看MS对_T(其中_TEXT(")与_T("")一样)的定义: [cpp] ...

  2. ASSERT和VERIFY的区别

    1. ASSERT与VERIFY宏在Debug模式下作用基本一致,二者都对表达式的值进行计算,如果值为非0,则什么事也不做:如果值为0,则输出诊断信息. 2.ASSERT与VERIFY宏在Releas ...

  3. VC中debug和release版本的区别

    vc中debug和release的不同 收藏  在使用VC开发软件的过程中,正当要享受那种兴奋的时候突然发现:release与debug运行结果不一致,甚至出错,而release又不方便调试,真的是当 ...

  4. VC++中GlobalAlloc()、malloc()和new()函数之间区别

    VC++中GlobalAlloc().malloc()和new()函数都可以用来实现内存的动态分配,那么它们之间有什么区别呢? 三者的区别主要有以下几点: 1.GlobalAlloc()函数在程序的堆 ...

  5. VC中MessageBox与AfxMessageBox用法与区别

    一.MessageBox()用法 1.函数原型 Messagebox函数在Win32 API和MFC里的定义有区别. Win32 API的定义如下: int WINAPI MessageBox(HWN ...

  6. VC下Debug 和Release 区别【转】

    在工具栏上点右键,选择编译,将编译win32debug改为win32 Release即可.如果需要调试的话,还需要再改回来方可. 最近写代码过程中,发现 Debug 下运行正常,Release 下就会 ...

  7. VC中的宏 (#define) 与预处理 (#if/#ifdef/#pragma) 的使用方法总结。

    C/C++ 预定义宏 例子:C/C++ 预定义宏的取值 C/C++ 预定义宏用途:诊断与调试输出 CRT 的诊断与调试输出:assert, _ASSERT/_ASSERTE, _RPTn/_RPTFn ...

  8. VC++中使用使用winnet类获取网页内容

    2005-09-01 VC++中使用使用winnet类获取网页内容 - [VC专栏] 微软提供的Winnet类是一个应用层的网络通信组件, 它可以使你的应用程序很容易的实现http.ftp.gophe ...

  9. 演练VC中的common一族

    1.表头控制 Header Control 2.图像列表控制 Image List 3.列表控制和视 List Control&List View 4.树控制和视 Tree Control&a ...

最新文章

  1. STL中heap算法(堆算法)
  2. java单例模式-有用的模式
  3. python web-2019年Python Web五大主流框架
  4. 20181204-1 每周例行报告
  5. C++2 dimension vector
  6. 数学学习笔记-三角函数
  7. HDU 1247 Hat’s Words 字典树(Trie树)
  8. Django Drops
  9. 【NOIP1999】【codevs1083】Cantor表(找规律)
  10. 高速串行总线走线难点在哪?重要线信号的处理经验分享
  11. TrueCrypt中文教程
  12. 手机图案密码(3*3点阵)开锁次数 C++
  13. 用友华表Cell组件/插件注册
  14. V4L2框架-control
  15. 基于科大讯飞AIUI平台自定义语义库的开发
  16. SAP介绍:概念、核心、开发语言、优缺点与集成
  17. mac系统更新后无法打开axure8/9
  18. 平均获客成本_获客成本(线上,线下)如何计算?
  19. matlab学生试用版,免费试用MATLAB
  20. MFC调用winhttp实现简易的HTTP服务器程序

热门文章

  1. 数据库-数据库的介绍
  2. 变量的引用-函数返回值传递引用
  3. SpringBoot高级消-息-RabbitMQ基本概念简介
  4. ad软件侵权律师函_Aspen Plus 9 软件安装教程
  5. 【图文详解】IDEA控制台运行时出现乱码:淇℃伅...
  6. free: seconds argument `1‘ failed
  7. 功能表单之树形选择字段类型的高级使用——JEPLUS软件快速开发平台
  8. 设计模式C++实现--Interpreter模式
  9. 操作主机 Infrastructure Master[为企业维护windows server 2008系列八]
  10. 自动布局报错(两条连线冲突):Unable to simultaneously satisfy constraints