ASSERT与VERIFY宏的区别
来源:互联网 发布:const修饰数组 编辑:程序博客网 时间:2024/04/27 13:33
http://blog.vckbase.com/smileonce/articles/1184.html
http://www.epubcn.com/edoctips/contents/computer/debug_release_diff.xml
今天公司有同事问我ASSERT与VERIFY宏有什么区别,虽然平时常用这两个宏对一些变量在Debug模式下作判断,但一时还真答不上来二者之间的具体差别,看来只是知其然不知其所以然。后来查了一些资料,总算弄清楚了二者之间的区别,整理后与同事交流了一番,感觉收获还是蛮大的。下面对我的理解进行了总结:
1 ASSERT与VERIFY宏在Debug模式下作用基本一致,二者都对表达式的值进行计算,如果值为非0,则什么事也不做;如果值为0,则输出诊断信息。
2 ASSERT与VERIFY宏在Release模式下效果完全不一样。ASSERT不计算表达式的值,也不会输出诊断信息;VERIFY计算表达式的值,但不管值为0还是非0都不会输出诊断信息。
VERIFY 与ASSERT用在程序调试上并无本质上的区别。
In the debug version of MFC, the VERIFY macro evaluates its argument. If the result is 0,
the macro prints a diagnostic message and halts the program. If the condition is nonzero,
it does nothing.
In the release version of MFC, VERIFY evaluates the expression but does not print or interrupt the program. For example, if the expression is a function call, the call will be made.
In the debug version of MFC, the VERIFY macro evaluates its argument. If the result is 0,
the macro prints a diagnostic message and halts the program. If the condition is nonzero,
it does nothing.
In the release version of MFC, VERIFY evaluates the expression but does not print or interrupt the program. For example, if the expression is a function call, the call will be made.
断言类型 定义ANSI C 断言void assert(int expression );C Runtime Lib 断言_ASSERT( booleanExpression );
_ASSERTE( booleanExpression );MFC 断言ASSERT( booleanExpression );
VERIFY( booleanExpression );
ASSERT_VALID( pObject );
ASSERT_KINDOF( classname, pobject );ATL 断言ATLASSERT( booleanExpression ); 此外,TRACE() 宏的编译也受 _DEBUG 控制。
所有这些断言都只在 Debug版中才被编译,而在 Release 版中被忽略。唯一的例外是 VERIFY() 。事实上,这些宏都是调用了 assert() 函数,只不过附加了一些与库有关的调试代码。如果你在这些宏中加入了任何程序代码,而不只是布尔表达式(例如赋值、能改变变量值的函数调用 等),那么 Release 版都不会执行这些操作,从而造成错误。初学者很容易犯这类错误,查找的方法也很简单,因为这些宏都已在上面列出,只要利用 VC++ 的 Find in Files 功能在工程所有文件中找到用这些宏的地方再一一检查即可。另外,有些高手可能还会加入 #ifdef _DEBUG 之类的条件编译,也要注意一下。
顺便值得一提的是 VERIFY() 宏,这个宏允许你将程序代码放在布尔表达式里。这个宏通常用来检查 Windows API 的返回值。有些人可能为这个原因而滥用 VERIFY() ,事实上这是危险的,因为 VERIFY() 违反了断言的思想,不能使程序代码和调试代码完全分离,最终可能会带来很多麻烦。因此,专家们建议尽量少用这个宏。
_ASSERTE( booleanExpression );MFC 断言ASSERT( booleanExpression );
VERIFY( booleanExpression );
ASSERT_VALID( pObject );
ASSERT_KINDOF( classname, pobject );ATL 断言ATLASSERT( booleanExpression ); 此外,TRACE() 宏的编译也受 _DEBUG 控制。
所有这些断言都只在 Debug版中才被编译,而在 Release 版中被忽略。唯一的例外是 VERIFY() 。事实上,这些宏都是调用了 assert() 函数,只不过附加了一些与库有关的调试代码。如果你在这些宏中加入了任何程序代码,而不只是布尔表达式(例如赋值、能改变变量值的函数调用 等),那么 Release 版都不会执行这些操作,从而造成错误。初学者很容易犯这类错误,查找的方法也很简单,因为这些宏都已在上面列出,只要利用 VC++ 的 Find in Files 功能在工程所有文件中找到用这些宏的地方再一一检查即可。另外,有些高手可能还会加入 #ifdef _DEBUG 之类的条件编译,也要注意一下。
顺便值得一提的是 VERIFY() 宏,这个宏允许你将程序代码放在布尔表达式里。这个宏通常用来检查 Windows API 的返回值。有些人可能为这个原因而滥用 VERIFY() ,事实上这是危险的,因为 VERIFY() 违反了断言的思想,不能使程序代码和调试代码完全分离,最终可能会带来很多麻烦。因此,专家们建议尽量少用这个宏。
0 0
- ASSERT与VERIFY宏的区别
- ASSERT与VERIFY宏的区别
- ASSERT与VERIFY宏的区别
- ASSERT与VERIFY宏的区别
- ASSERT与VERIFY宏的区别
- ASSERT与VERIFY宏的区别
- ASSERT与VERIFY宏的区别
- ASSERT与VERIFY的区别
- ASSERT与VERIFY的区别
- ASSERT 与 VERIFY 区别
- assert与verify区别
- MFC程序中ASSERT与VERIFY两个宏的区别
- MFC中VERIFY与ASSERT的区别
- ASSERT VERIFY TRACE的区别与应用
- ASSERT与VERIFY宏
- ASSERT和VERIFY的区别
- verify和assert的区别
- verify和assert的区别
- OCP 1Z0 052 117
- WebView和js交互
- HDU 4324 Triangle LOVE(拓扑排序)
- 阿里巴巴笔试题
- 阿里无线高增长是伪繁荣?
- ASSERT与VERIFY宏的区别
- linux程序设计笔记
- Qt生成灰度图
- org.hibernate.hql.ast.QuerySyntaxException: is not mapped 异常总结
- webview
- 一起来看下港台地区近期相机的人气排行榜吧。
- asp.net判断用户是否登录(SetAuthCookie相关问题)
- 看世界怀比上班还辛苦
- bash的工作管理:jobs列出背景中运行的程序