在非MFC程序中使用调试宏 ASSERT(),VERIFY()和 TRACE()

 在非MFC程序中使用调试宏   ASSERT(),VERIFY()和   TRACE()
 
作者:Gabriel   Fleseriu   译者:WinDancer   From:http://www.x-temple.com/  
 
  游戏制作已经开始采用C++了,却鲜有人选择使用MFC。但笔者觉得的   ASSERT(),VERIFY()和   TRACE()这几个宏很好用。所以就想自己写一个版本来适应Windows平台下不同的工程类型。  

提醒:  

ASSERT()被测试它的参数,若参数为0,则中断执行并打印一段说明消息。在   Release   版本的程序中它不起任何作用。  
VERIFY()和   ASSERT()很相似,区别在于在   Release   版本中它仍然有效(译者注:原作者在这里没有讲清楚,VERIFY()不会打印说明,只是会对参数表达式求值)。  
ASSERT()使用的时候必须保证参数表达式中不能有函数调用(译者注:ASSERT()宏在   Release   版本中不对表达式求值),因此对于任何有函数调用的参数表达式,应该使用宏   VERIFY(),以保证表达式中的函数调用在   Release   版本中会被正确求值。  
TRACE()基本上就是函数   printf()的一个复制品,唯一的区别是它把结果输出到调试窗口。在   Release   版本中,它也是无效的。  
这三个宏在   Release   版本中都不会产生任何实质性的影响,它们是否起作用取决于是否定义了预定义了宏   _DEBUG。这是对   Microsoft   Visual   C++   而言,在其它的编译器中可能其它不同的宏。
  Since   it   makes   no   sense   to   re-invent   the   wheel(译者注:这好像是一句俗语,大致意思是“没有必要(意义)自己从头写起”,但原句究竟如何,在下水平有限,实难猜出。故将原文放上,望高人赐教,感激不尽!),笔者在看了   MFC   的代码之后类似地建立了自己的宏。对于   ASSERT()和   VERIFY()则去掉了花哨的“Debug   assertion   failed...”对话框,只是简单的产生一个单纯的断点中断。

  要使用   ASSERT(),VERIFY()和   TRACE(),有两个文件是必需的:debug.h   和   debug.cpp。首先需要在工程中的主要头文件里中包含文件   debug.h。因为它本身没有包括其它任何头文件,所以不必担心会产生头件的包含递归。另外还要将   debug.cpp   加入到工程中的源文件中。  

这里是代码:  

//   file   debug.h
#ifndef   __DEBUG_H__
#define   __DEBUG_H__

#ifdef   _DEBUG

void   _trace(char   *fmt,   ...);

#define   ASSERT(x)   {if(!(x))   _asm{int   0x03}}
#define   VERIFY(x)   {if(!(x))   _asm{int   0x03}}     //   译注:为调试版本时产生中断有效

#else
#define   ASSERT(x)
#define   VERIFY(x)   x                                     //   译注:为发行版本时不产生中断
#endif

#ifdef   _DEBUG
#define   TRACE   _trace

#else
inline   void   _trace(LPCTSTR   fmt,   ...)   {   }
#define   TRACE     1   ?   (void)0   :   _trace
#endif

#endif   //   __DEBUG_H__


//   file   debug.cpp
#ifdef   _DEBUG
#include   <stdio.h>
#include   <stdarg.h>
#include   <windows.h>

void   _trace(char   *fmt,   ...)
{
char   out[1024];
va_list   body;
va_start(body,   fmt);
vsprintf(out,   fmt,   body);           //   译注:格式化输入的字符串   fmtt
va_end(body);                                   //               到输出字符串   ou
OutputDebugString(out);               //   译注:输出格式化后的字符串到调试器
}
#endif


--------------------------------------------------------------------------------

译者续:一点小扩展

  大家可以看到宏   TRACE()的最后,调用的是   OutPutDebugString()函数,只能将信息输出到调试器窗口中,但我们同样也可以实现   MFC   中的弹出式窗口,只要用   MessageBox()函数输出就可以了。(不过……好像样子也不一样哎!)

手记:

  此为本人的第一篇翻译习作,其中胡扯八道、乱七八糟、稀奇古怪之处数不胜数!(汗……)但看到这篇文章既短又小、语法简单,不翻白不翻,所以就操刀上阵,为大家做成这道小菜!

  不过说实话,这篇文章确实很不错,WinDancer   每次在写基于   WIN32   SDK   的程序时都会感叹没有这样的宏可用,相信也有很多同志也这么想过。虽然   SDK   下可以用   assert(),但却没有   TRACE()这样的好东东呀!现在有了这篇文章就可以了大家的心事了!  
 

——   WinDancer            
于   2002   年   8   月   16   日夜
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值