VC中assert,assert_valid,verify,trace的使用解析
"这篇文章主要介绍了在VC++编程中常用的几个宏:assert,assert_valid,verify和trace,它们各自有特定的用途和场景。对于初学者来说,理解它们的区别和使用方法是十分重要的。" 在VC++开发环境中,assert,assert_valid,verify和trace是用来进行程序调试和验证的重要工具。下面将分别详细介绍这几个宏的功能和使用场景。 1. **ASSERT()** ASSERT()宏主要用于检查程序中的逻辑条件,它会在调试版本中检查表达式的结果。如果表达式的值为假(即0),那么在调试模式下会弹出一个对话框显示错误信息,并暂停程序执行。这样可以帮助开发者找出代码中的错误。例如: ```cpp ASSERT(pPointer); // 检查指针是否为空 ASSERT(n > 0 && n < 100); // 检查n是否在0到100之间 ``` 在Release版本中,ASSERT()会被编译器优化掉,不会影响程序性能。 2. **ASSERT_VALID()** 这个宏是针对C++中的CObject类或其派生类设计的,用于验证对象的内部状态是否有效。当调用ASSERT_VALID()时,它会检查对象的成员变量,确保它们符合预期。这有助于检测可能的悬空指针、未初始化的对象等问题。例如: ```cpp ASSERT_VALID(this); // 验证当前对象 ASSERT_VALID(pView); // 验证视图对象 ``` 和ASSERT()一样,ASSERT_VALID()在Release版本中也会被优化掉。 3. **VERIFY()** VERIFY()与ASSERT()类似,但它的一个关键区别在于,即使在Release版本中,VERIFY()也会执行检查,但不会中断程序。如果检查失败,VERIFY()只会打印一条消息,而程序会继续执行。这种方式适用于那些必须在所有版本中都要执行的检查,但又不想中断程序的情况。例如: ```cpp VERIFY(pPointer != NULL); // 检查指针是否为空,但不会中断 ``` 4. **TRACE()** TRACE()宏类似于C语言的printf()函数,用于输出日志信息。它在调试版本中工作,可以在控制台窗口或者调试输出窗口看到输出的信息。TRACE还可以配合多个参数版本(如TRACE0, TRACE1, ...)来输出不同数量的变量值。例如: ```cpp TRACE("水温: %d\n", nWaterTemp); // 输出水温 ``` 在Release版本中,TRACE()宏的输出会被忽略,不会对程序性能产生影响。 在实际编程中,这些宏通常结合使用,如在switch-case语句中,可以使用ASSERT()来确保程序不会进入不应该到达的默认分支: ```cpp switch (nRGBColors) { case nRed: { // some instructions. } break; case nGreen: { // some instructions. } break; case nBlue: { // some instructions. } break; default: ASSERT(0); // 我们不应该来到这里! } ``` 通过熟练掌握assert,assert_valid,verify,trace的用法,开发者可以更有效地定位和修复代码中的问题,提高程序的健壮性和可靠性。在编写代码时,应根据需求选择合适的宏,以实现最佳的调试和运行效果。
对于开始学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;
下载后可阅读完整内容,剩余1页未读,立即下载
- 粉丝: 0
- 资源: 3
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 李兴华Java基础教程:从入门到精通
- U盘与硬盘启动安装教程:从菜鸟到专家
- C++面试宝典:动态内存管理与继承解析
- C++ STL源码深度解析:专家级剖析与关键技术
- C/C++调用DOS命令实战指南
- 神经网络补偿的多传感器航迹融合技术
- GIS中的大地坐标系与椭球体解析
- 海思Hi3515 H.264编解码处理器用户手册
- Oracle基础练习题与解答
- 谷歌地球3D建筑筛选新流程详解
- CFO与CIO携手:数据管理与企业增值的战略
- Eclipse IDE基础教程:从入门到精通
- Shell脚本专家宝典:全面学习与资源指南
- Tomcat安装指南:附带JDK配置步骤
- NA3003A电子水准仪数据格式解析与转换研究
- 自动化专业英语词汇精华:必备术语集锦