ASSERT与VERIFY宏的区别(转载)
2009-08-05 17:48
113 查看
1 ASSERT与VERIFY宏在Debug模式下作用基本一致,二者都对表达式的值进行计算,如果值为非0,则什么事也不做;如果值为0,则输出诊断信息。
2 ASSERT与VERIFY宏在Release模式下效果完全不一样。ASSERT不计算表达式的值,也不会输出诊断信息;VERIFY计算表达式的值,但不管值为0还是非0都不会输出诊断信息。VERIFY与ASSERT用在程序调试上并无本质上的区别。
此外,TRACE() 宏的编译也受 _DEBUG 控制。
所有这些断言都只在 Debug版中才被编译,而在 Release 版中被忽略。唯一的例外是 VERIFY() 。事实上,这些宏都是调用了 assert() 函数,只不过附加了一些与库有关的调试代码。如果你在这些宏中加入了任何程序代码,而不只是布尔表达式(例如赋值、能改变变量值的函数调用 等),那么 Release 版都不会执行这些操作,从而造成错误。初学者很容易犯这类错误,查找的方法也很简单,因为这些宏都已在上面列出,只要利用 VC++ 的 Find in Files 功能在工程所有文件中找到用这些宏的地方再一一检查即可。另外,有些高手可能还会加入 #ifdef _DEBUG 之类的条件编译,也要注意一下。
顺便值得一提的是 VERIFY() 宏,这个宏允许你将程序代码放在布尔表达式里。这个宏通常用来检查 Windows API 的返回值。有些人可能为这个原因而滥用 VERIFY() ,事实上这是危险的,因为 VERIFY() 违反了断言的思想,不能使程序代码和调试代码完全分离,最终可能会带来很多麻烦。因此,专家们建议尽量少用这个宏
2 ASSERT与VERIFY宏在Release模式下效果完全不一样。ASSERT不计算表达式的值,也不会输出诊断信息;VERIFY计算表达式的值,但不管值为0还是非0都不会输出诊断信息。VERIFY与ASSERT用在程序调试上并无本质上的区别。
此外,TRACE() 宏的编译也受 _DEBUG 控制。
所有这些断言都只在 Debug版中才被编译,而在 Release 版中被忽略。唯一的例外是 VERIFY() 。事实上,这些宏都是调用了 assert() 函数,只不过附加了一些与库有关的调试代码。如果你在这些宏中加入了任何程序代码,而不只是布尔表达式(例如赋值、能改变变量值的函数调用 等),那么 Release 版都不会执行这些操作,从而造成错误。初学者很容易犯这类错误,查找的方法也很简单,因为这些宏都已在上面列出,只要利用 VC++ 的 Find in Files 功能在工程所有文件中找到用这些宏的地方再一一检查即可。另外,有些高手可能还会加入 #ifdef _DEBUG 之类的条件编译,也要注意一下。
顺便值得一提的是 VERIFY() 宏,这个宏允许你将程序代码放在布尔表达式里。这个宏通常用来检查 Windows API 的返回值。有些人可能为这个原因而滥用 VERIFY() ,事实上这是危险的,因为 VERIFY() 违反了断言的思想,不能使程序代码和调试代码完全分离,最终可能会带来很多麻烦。因此,专家们建议尽量少用这个宏
相关文章推荐
- ASSERT与VERIFY宏的区别
- ASSERT与VERIFY宏的区别
- ASSERT与VERIFY宏的区别
- ASSERT与VERIFY宏的区别
- ASSERT与VERIFY宏的区别
- 判断一个指针是否为空,abort()、assert、抛出异常的使用、ASSERT与VERIFY宏的区别
- ASSERT与VERIFY宏的区别
- MBR与GPT分区的区别及使用注意事项(转载)
- 【转载】浅谈阻塞和非阻塞语句的本质区别
- 【转载】类和接口的区别
- [转载]UNICODE,GBK,UTF-8区别
- (转载)java中抽象类和接口的区别
- css中单位 px、em 的区别【转载】
- HTML中name和id的区别(转载)
- 转载关于KeyPress和KeyDown事件的区别和联系
- (转载)Android xml资源文件中@、@android:type、@*、?、@+引用写法含义以及区别
- Hibernian中各种保存方法的区别(转载)
- C++中#error/assert/static_assert的区别及使用
- [转载]SQL语句中LEFT JOIN ON WHERE和LEFT JOIN ON AND的区别
- [转载]String、StringBuffer与StringBuilder之间区别