您的位置:首页 > 其它

assert,assert_valid,verify,trace用法

2014-06-17 09:45 239 查看
原文链接:http://wenku.baidu.com/link?url=9_kUepbxsZKUkctkPE5Zr1vk7-eqiNcw77-whaVHwQBG8wJeAoUZcV1VHPGmd-ePHU7YdACrtj7nGqo4VsBMMsSEXvmjxaPbReTCcIi8foi

assert,assert_valid,verify,trace用法(转载) 2010-08-05 9:10 

对于开始学vc的人,对于assert,assert_valid,verify,trace的宏感到很奇怪,总是觉得很难掌握似的,其实这些主要是没有理清楚他们各自宏之间深层次的意义。这些都是我平时的学习笔记,可能有些是网上的资源,如果有重复请大家不要见怪~ 

 

ASSERT() 

ASSERT()被测试它的参数,若参数为0,则中断执行并打印一段说明消息。在 Release 版本的程序中它不起任何作

用。ASSERT()使用的时候必须保证参数表达式中不能有函数调用(译者注:ASSERT()宏在 Release 版本中不对表

达式求值),因此对于任何有函数调用的参数表达式,应该使用宏 VERIFY(),以保证表达式中的函数调用在 Release

版本中会被正确求值。 

断言(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: {//some instructions.} break; case nGreen: {//some instructions.} break; case nBlue: {//some instructions.} 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()。 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  vs mfc