登录社区:用户名: 密码: 忘记密码 网页功能:加入收藏 设为首页 网站搜索  

文档

下载

图书

论坛

安全

源码

硬件

游戏
首页 信息 空间 VB VC Delphi Java Flash 补丁 控件 安全 黑客 电子书 笔记本 手机 MP3 杀毒 QQ群 产品库 分类信息 编程网站
 内容搜索 网页 下载 源代码
热点文章
  SSE 介紹
  浮点数到整数的快速转换
  基于SSE指令集的程序设计简介
  CPU 的 cache 和 latency
  关键字 对齐 内存对齐
  INTEL 体系结构 MMX™ ..
  在非MFC程序中使用调试宏 AS..
  Microsoft Visual C++ 浮点优..
  INTEL X86 体系 32 位汇编语..
  加速&优化技术
  加快程序运行速度的技巧
  VC代码的编写和调试
本站原创
您现在的位置:立华软件园->游戏开发->程序设计->优化调试
在非MFC程序中使用调试宏 ASSERT(),VERIFY()和 TRACE()
发表日期:2006-08-28作者:[转贴] 出处:  

  游戏制作已经开始采用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.hdebug.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()这样的好东东呀!现在有了这篇文章就可以了大家的心事了!

    我来说两句】 【发送给朋友】 【加入收藏】 【返加顶部】 【打印本页】 【关闭窗口
    中搜索 在非MFC程序中使用调试宏 ASSERT(),VERIFY()和 TRACE()

     ■ [欢迎对本文发表评论]
    用  户:  匿名发出:
    您要为您所发的言论的后果负责,故请各位遵纪守法并注意语言文明。

    关于我们 / 合作推广 / 给我留言 / 版权举报 / 意见建议 / 广告投放 / 友情链接

    Copyright ©2001-2003 Allrights reserved
    e_mail:站长:webmaster(at)lihuasoft.net
    网站编程QQ群  
    京ICP备05001064号

    页面生成时间:0.00437