游戏制作已经开始采用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. 设计模式入门之桥接模式Bridge

      Abstraction:抽象部分的父类,定义须要实现的接口.维护对实现部分的引用,从而把实现桥接到Implementor中去 Implementor:实现部分的接口 RefinedAbstractio ...

    2. 记WebUtility.HtmlDecode将&nbsp;转成特殊空格的问题

      在.net中 System.Web.HttpUtility.HtmlDecode(或者WebUtility.HtmlDecode) 方法会将   解码为特殊空格(Ascii值为,对应的值为:\u00A ...

    3. 与html相关的知识点整理

      梳理html时发现的一些问题.总结一下,答案大都从网上找来. 一.html 与 htm 的区别 没有本质的区别..htm是在win32时代,系统只能识别3位扩展名时使用的.现在一般都使用.html. ...

    4. The Painter's Partition Problem Part II

      (http://leetcode.com/2011/04/the-painters-partition-problem-part-ii.html) This is Part II of the art ...

    5. cocos2d-x3.9利用cocos引擎一键打包Android平台APK(C++小白教程)

      链接地址:http://www.cocoachina.com/bbs/read.php?tid=333937 cocos2d-x3.9利用cocos引擎一键打包Android平台APK(C++小白教程 ...

    6. cocos2dx定时器

      cocos2dx三种定时器的使用以及停止schedule,scheduleUpdate,scheduleOnce 首先,什么是定时器呢?或许你有时候会想让某个函数不断的去执行,或许只是执行一次,获取你 ...

    7. C#共享内存实例 附源码

      原文 C#共享内存实例 附源码 网上有C#共享内存类,不过功能太简单了,并且写内存每次都从开头写.故对此进行了改进,并做了个小例子,供需要的人参考. 主要改进点: 通过利用共享内存的一部分空间(以下称 ...

    8. cocos2d-x中的尺寸之三

      通过上面两个文章的分析,我们在这个博文里做个总结: CCEGLView::getFrameSize()返回的是窗口相对于屏幕像素的尺寸,这个尺寸,只要窗口没变化,值就不会变化 CCDirector:: ...

    9. C语言参数传递

      //--------------------单向值传递------------------------ // swap这个方法在被调用时,给形参a,b分配了空间 // 主调函数将[数值]传递给[形参] ...

    10. mac下的搭建本地discuz论坛

      本地是php+mysql+apache的环境.也可以用xampp一键安装的东西,那个貌似比较省事.因为我的本地php环境已经装好了,就直接下了discuz的代码安装. 打开web共享 将discuz代 ...