游戏制作已经开始采用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. C# 微信公众平台开发(2)-- 微信菜单

      上一篇了解微信开发者中心 URL的配置验证: 验证成功后,就可以对获取的接口权限进行操作 自定义菜单接口可实现多种类型按钮,用的比较多的是 1.click:点击推事件 用户点击click类型按钮后,微 ...

    2. POJ 2253 Frogger floyd算法

      题目:click here 题意: 给出两只青蛙的坐标A.B,和其他的n-2个坐标,任意两坐标间是双向连通的.显然从A到B存在至少一条的通路,每一条通路的元素都是这条通路中前后两个点的距离,这些距离中 ...

    3. vector中resize和reserve的区别,代码验证

      #include <vector> using namespace std; int main() { vector<int> resizeVect; vector<in ...

    4. BZOJAC400题留念

      BZOJAC400题了...

    5. JSP——页面三大部分(指令、脚本、动作组件)

      一.JSP简介: JSP(Java Server Pages,Java服务器端页面开发技术) JSP可以实现的技术都可以通过Servlet实现,他们本质上是一样的.但JSP设计的目的在于简化表示层的表 ...

    6. PHP_Yii框架_专辑<一>

      一.PHP主流框架 cakephp—速度比较慢.CI(codeIgniter)—小型.symfony. TP(thinkphp)—国人开发.小型.zendframework(官方)—大型 Yii: 特 ...

    7. Android 学习开发笔记《Service 与 Thread 的区别 》

      很多时候,你可能会问,为什么要用 Service,而不用 Thread 呢,因为用 Thread 是很方便的,比起 Service 也方便多了,下面我详细的来解释一下. 1). Thread:Thre ...

    8. Best practice for Invoke other scripts or exe in PowerShell

      Recently, I find I used many different type method to invoke other scripts or exe in PowerShell. May ...

    9. Oracle笔记(十三) 视图、同义词、索引

      一.视图 在之前所学习过的所有的SQL语法之中,查询操作是最麻烦的,如果程序开发人员将大量的精力都浪费在查询的编写上,则肯定影响代码的工作进度,所以 一个好的数据库设计人员,除了根据业务的操作设计出数 ...

    10. QT窗口拖拽功能简单应用(处理dragEnterEvent和dropEvent事件,不同的事件有不同的信息,比如mimeData)

      void dragEnterEvent(QDragEnterEvent *event); void dropEvent(QDropEvent *event); ui->lineEdit-> ...