游戏制作已经开始采用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++ 而言,在其它的编译器中可能其它不同的宏。
  • 这里是代码:

    1. #include "stdafx.h"
    2. #include <stdio.h>
    3. #include <stdarg.h>
    4. #include <windows.h>
    5. void _trace(char *fmt, ...);
    6. #ifdef _DEBUG
    7. #define ASSERT(x) {if(!(x)) _asm{int 0x03}}
    8. #define VERIFY(x) {if(!(x)) _asm{int 0x03}}     // 译注:为调试版本时产生中断有效
    9. #else
    10. #define ASSERT(x)
    11. #define VERIFY(x) x                             // 译注:为发行版本时不产生中断
    12. #endif
    13. #ifdef _DEBUG
    14. #define TRACE _trace
    15. #else
    16. inline void _trace(LPCTSTR fmt, ...) { }
    17. #define TRACE
    18. #endif
    19. void _trace(char *fmt, ...)
    20. {
    21. char out[1024];
    22. va_list body;
    23. va_start(body, fmt);
    24. vsprintf(out, fmt, body);     // 译注:格式化输入的字符串 fmtt
    25. va_end(body);                 //       到输出字符串 ou
    26. OutputDebugStringA(out);       // 译注:输出格式化后的字符串到调试器
    27. }

    在非MFC程序中使用调试宏 ASSERT(),VERIFY()和 TRACE()的更多相关文章

    1. MFC程序中使用调试宏ASSERT()、ASSERT_VALID()、VERIFY()和TRACE()的区别

      其实这篇文章说的很明白了:http://dev.gameres.com/Program/Other/DebugMacro.htm 结论如下: 1.ASSERT()测试它的参数,若参数为0,则中断执行并 ...

    2. 在非MFC程序中引用CString

      CString在当今软件设计界里还是小有名气的,说它是MFC中使用的最多的类一点也不过,然而在使用sdk编windows程序的时候,确不能利用CString类,只能用sdk的运行时库,比如strlen ...

    3. 非MFC工程中使用MFC库

      目录(?)[-] 需求说明 常见问题 问题分析 参考解决方法 我的解决方案 Stdafxh的原理   需求说明 C++工程的类型有很多,从VS(或VC)可以看到常见的有:Win32 Console A ...

    4. MFC程序中消息以及函数的处理顺序简介[转]

      MFC应用程序中处理消息的顺序 1.AfxWndProc()      该函数负责接收消息,找到消息所属的CWnd对象,然后调用AfxCallWndProc 2.AfxCallWndProc()  该 ...

    5. 如何在VS2010的VC++ 基于对话框的MFC程序中添加菜单

      方法1:亲测 成功  转载自https://social.msdn.microsoft.com/Forums/vstudio/zh-CN/48338f6b-e5d9-4c0c-8b17-05ca3ef ...

    6. VC++非MFC项目中如何使用TRACE宏

      记得原来尝试学MFC的时候觉得有一个TRACE可以在Debug时向VS的调试输出窗口输出字串符,用来调试时跟踪变量很方便. 然则如果不是MFC项目或者ATL的项目的话是不能使用这个宏的.这时有一个没有 ...

    7. MFC窗体程序中添加调试控制台

      在编写复杂程序的过程中,我们经常需要将一些信息输出到文件或者屏幕上.较控制台应用程序,MFC窗体程序要显得麻烦一些! 下面有2种方法来实现为MFC窗体程序添加调试控制台,方便程序员调试程序和了解当前程 ...

    8. 在MFC程序中使用AnyCAD图形控件

      AnyCAD图形控件有.Net版本和C++两个版本,使用C++要比C#稍微繁杂一点.SDK中提供了针对MFC的文档视图的封装,只需改一下几个基类即可. 准备 VS2010 下载C++版本的AnyCAD ...

    9. 在MFC程序中使用XML文件配置工具栏

      现在我发现使用Visual Studio的资源编辑器进行编辑资源有着诸多的不便:首先是任何资源的变动一般变动代码,不利于系统维护,其次Visual Studio的资源编辑器的本身的功能有限,也不利于界 ...

    随机推荐

    1. Tomcat 的context.xml

      1. 在tomcat 5.5之前: --------------------------------------------------------------- Context体如今/conf/se ...

    2. C标准中一些预定义的宏

      C标准中指定了一些预定义的宏,对于编程经常会用到.下面这个表中就是一些常常用到的预定义宏. 宏(双下滑线) 意义 __DATE__ 进行预处理的日期(“Mmm dd yyyy”形式的字符串文字) __ ...

    3. linux网络编程之网络函数详解

      1.epoll_create函数 函数声明:int epoll_create(int size) 该 函数生成一个epoll专用的文件描述符.它其实是在内核申请一空间,用来存放你想关注的socket ...

    4. Session会话跟踪

      用encodeURL重写URL public class SessionA extends HttpServlet { @Override protected void doGet(HttpServl ...

    5. C#操作Office.word(三)

      前面两篇博客讲解了怎么通过程序控制word的生成,包括生成文字.添加表格.添加图片等.这篇博客主要说一下怎么把word图片转换成pdf. using System; using System.Coll ...

    6. HDU3535-AreYouBusy

      描述: As having become a junior, xiaoA recognizes that there is not much time for her to AC problems, ...

    7. <转> Python的优雅技巧

      枚举 不要这么做: 全选复制放进笔记 i = 0 for item in iterable: print i, item i += 1 而是这样: 全选复制放进笔记 for i, item in en ...

    8. Python 安装、循环语句、数据类型(一)

      一.关于版本的选择 Should i use Python 2 or Python 3 for my development activity?转载自Python官网 Short version: P ...

    9. 宣布在日本地区正式发布 Windows Azure

       昨天,我与 Microsoft 日本的集团副总裁 Yasuyuki Higuchi 一同站在台上,宣布在两个新地区正式发布 Windows Azure:日本东部和日本西部.能够亲自见证 Micr ...

    10. ACM_HDU 1231 最大连续子序列 (dp)_代码分析

      Problem Description 给定K个整数的序列{ N1, N2, ..., NK },其任意连续子序列可表示为{ Ni, Ni+1, ..., Nj },其中 1 <= i < ...