游戏制作已经开始采用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. request.getParameterValues与request.getParameter的差别

      一. 简单的对照 request.getParameter用的比較多,相对熟悉 request.getParameterValues(String   name)是获得如checkbox类(名字同样, ...

    2. iOS中Block介绍 基础

      ios开发block的使用指南,以及深入理解block的内存管理,也适用于osx开发.讨论范围:block的使用,内存管理,内部实现.不包含的内容:gc arc下的block内存,block在c++中 ...

    3. using的用法

      1.using指令.using + 命名空间名字.命名空间名字可以是系统本有,也可是自己定义的class. 2.using别名.using + 别名 = 包括详细命名空间信息的具体的类型. 达成条件: ...

    4. PHP练习项目笔记之COOKIES

      主要是在登录和退出的时候,设置cookies.来保存登录和安全退出 1:在登录页面设置 //设置cookies的值 _setcookies($_rows['tg_username'], $_rows[ ...

    5. 解决spark运行中failed to locate the winutils binary in the hadoop binary path的问题

      1.下载hadoop-common-2.2.0-bin并解压到某个目录 https://github.com/srccodes/hadoop-common-2.2.0-bin 2.设置hadoop.h ...

    6. [转]Swift 简介 - 苹果最新的编程语言

      Swift 真的可以说是最新的编程语言了,2014wwdc刚刚发布,下面来了解一下都有哪些特点. 首先感谢原作者,主要内容是借鉴他的,参考链接 http://zh.lucida.me/blog/an- ...

    7. 2_Cat Years

      2 // // ViewController.swift // Cat Years // // Created by ZC on 16/1/6. // Copyright © 2016年 ZC. Al ...

    8. QTableView表格滚动条样式(QSS真是细致到家了)

      环境:Qt5.3 IDE:QtCreator 效果预览: 垂直与水平滚动条样式 代码: ui->QTableView->verticalScrollBar()->setStyleSh ...

    9. Docker学习总结之Run命令介绍

      Docker学习总结之Run命令介绍 本文由Vikings(http://www.cnblogs.com/vikings-blog/) 原创,转载请标明.谢谢! 在使用Docker时,执行最多的命令某 ...

    10. Intersecting Lines(数学)

      Intersecting Lines Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 12844   Accepted: 57 ...