在非MFC程序中使用调试宏 ASSERT(),VERIFY()和 TRACE()

简介: 游戏制作已经开始采用C++了,却鲜有人选择使用MFC。但笔者觉得的 ASSERT(),VERIFY()和 TRACE()这几个宏很好用。所以就想自己写一个版本来适应Windows平台下不同的工程类型。 提醒: ASSERT()被测试它的参数,若参数为0,则中断执行并打印一段说明消息。

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

这里是代码:

 

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

目录
相关文章
|
数据采集 数据可视化 数据挖掘
多维数据分析:使用Pandas进行复杂的数据操作和聚合
【4月更文挑战第12天】Pandas是Python的强大数据分析库,提供DataFrame数据结构进行多维数据处理。本文介绍了使用Pandas进行多维数据分析的流程:1) 导入数据(如CSV、Excel);2) 数据预处理,包括缺失值处理和类型转换;3) 数据探索,利用describe()、hist()、plot()等进行统计和可视化;4) 数据操作,如筛选、排序和分组;5) 数据聚合,通过groupby()和agg()进行计算。文中还给出了电商数据分析的案例,展示Pandas在实际应用中的价值。
548 2
|
Java
12《hutool实战》:FileTypeUtil 文件类型判断工具类(JAVA 小虚竹)
12《hutool实战》:FileTypeUtil 文件类型判断工具类(JAVA 小虚竹)
982 0
12《hutool实战》:FileTypeUtil 文件类型判断工具类(JAVA 小虚竹)
|
2月前
|
机器学习/深度学习 人工智能 算法
AI-Compass RLHF人类反馈强化学习技术栈:集成TRL、OpenRLHF、veRL等框架,涵盖PPO、DPO算法实现大模型人类价值对齐
AI-Compass RLHF人类反馈强化学习技术栈:集成TRL、OpenRLHF、veRL等框架,涵盖PPO、DPO算法实现大模型人类价值对齐
 AI-Compass RLHF人类反馈强化学习技术栈:集成TRL、OpenRLHF、veRL等框架,涵盖PPO、DPO算法实现大模型人类价值对齐
|
分布式计算 Hadoop Java
HBase 安装之后版本的验证的bug:(错误的替换、找不到或无法加载主类、SLF4J)
HBase 安装之后版本的验证的bug:(错误的替换、找不到或无法加载主类、SLF4J)
1155 1
HBase 安装之后版本的验证的bug:(错误的替换、找不到或无法加载主类、SLF4J)
|
Linux SoC
Linux设备树(DTS)
Dts:DTS即Device Tree Source,是一个文本形式的文件,用于描述硬件信息。一般都是固定信息,无法变更,无法overlay。 设备树由来 linux内核源码中,之前充斥着大量的平台相关(platform Device)配置,而这些代码大多是杂乱且重复的,这使得ARM体系结构的代码维护者和内核维护者在发布一个新的版本的时候有大量的工作要做,以至于LinusTorvalds 在2011年3月17日的ARM Linux邮件列表中宣称“Gaah.Guys,this whole ARM thing is a f*cking pain in the ass”这使得整个ARM社区不得不
285 1
Linux设备树(DTS)
|
6月前
|
机器学习/深度学习 数据采集 人工智能
DeepSeek R1 最新全面综述:R1 为什么能让 LLM 像人一样思考?
DeepSeek R1 最新全面综述:R1 为什么能让 LLM 像人一样思考?
243 0
yolov5项目如何安装pycocotools和opencv-python?
本文提供了解决yolov5项目中安装pycocotools和opencv-python包失败的两种方法:手动安装或使用国内镜像源进行安装。
yolov5项目如何安装pycocotools和opencv-python?
|
存储 缓存 NoSQL
深入解析Memcached:内部机制、存储结构及在大数据中的应用
深入解析Memcached:内部机制、存储结构及在大数据中的应用
|
机器学习/深度学习 人工智能 算法
深入白盒测试:提升软件质量的策略与实践
【4月更文挑战第9天】在追求软件产品质量的道路上,白盒测试作为一项重要的验证手段,其价值和影响力日益凸显。本文将深入探讨白盒测试的核心概念、实施策略以及面临的挑战,旨在为软件开发和质量保证的专业人士提供一套系统化的白盒测试方法论。通过对代码逻辑结构、执行路径以及内部算法的严密审查,我们揭示了如何有效发现并修复潜在的缺陷,确保软件的稳定性和性能满足用户期待。文章还将分享一系列创新工具和技术,助力测试人员提高测试覆盖率,减少人工干预,最终实现自动化和智能化的软件测试流程。
|
存储 搜索推荐 网络协议
公网远程访问本地硬盘文件
公网远程访问本地硬盘文件
292 17
公网远程访问本地硬盘文件