#ifndef __HSS_DBG_HSS__
#define __HSS_DBG_HSS__ /**************************************************************************************************\
* 2009-06-28 调试信息输出的宏版
    (1) 一定起作用的宏
__trace, __trace_file, __trace_fmt, __trace_end (2) 需要定义 __dbg__才有作用的宏
__if, _if, __trace_dbg, __trace_file_dbg, __trace_fmt_dbg, __trace_end_dbg (宏名dbg在后面,是为了在搜索__trace的时候可以找到所有的宏) (3) 用法示例: __trace "a=%d b=%d\r\n", a, b); __trace_end __trace_file "a=%d b=%d\r\n", a, b); __trace_end //注意:这个宏有参数 ,并且在宏的参数括号的后面,不能有逗号
__trace_fmt(__FILE__, __LINE__, TRUE) "a=%d b=%d", a, b); __trace_end 其中__FILE__可以替换为其他文件名,若是全路径会只显示文件名 (4) __if 是长格式版,显示条件的内容 (5) _if 是短格式版,不显示条件的内容,仅显示条件的值 \**************************************************************************************************/
#include <shlwapi.h>
#pragma comment(lib, "shlwapi.lib") ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#define __trace_end if (__sztrace && __sztrace[0]) \
OutputDebugStringA(__sztrace); \
} #define __trace \
{ \
char __sztrace[260] = {0}; \
_snprintf(__sztrace, sizeof(__sztrace), #define __trace_file \
{ \
char __sztrace[260] = {0}; \
int _n = _snprintf(__sztrace, sizeof(__sztrace)-1, "%08X %s/%d ", GetCurrentThreadId(), strrchr(__FILE__, '\\') + 1, __LINE__); \
_snprintf(__sztrace+_n, sizeof(__sztrace)-_n-1, #define __trace_fmt(file, line, error) \
{ \
char __sztrace[260] = {0}; \
int __n = 0; \
if (file && ((char*)file)[0]) \
{ \
LPCTSTR __p = strrchr(file, '\\'); \
if (__p == 0) \
__p = file; \
__n += _snprintf(__sztrace+__n, sizeof(__sztrace)-1-__n, "%s ", __p); \
} \
if (line) \
{ \
__n += _snprintf(__sztrace+__n, sizeof(__sztrace)-1-__n, "/%d ", line); \
} \
if (error) \
{ \
int se = GetLastError(); \
LPSTR __lpMsgbuf = 0; \
if (FormatMessage( \
FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, \
NULL, \
se, \
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), \
(LPSTR) & __lpMsgbuf, \
0, \
NULL) \
) \
{ \
if (__lpMsgbuf && __lpMsgbuf[0]) \
{ \
__n += _snprintf(__sztrace+__n, sizeof(__sztrace)-1-__n, "%s (%d) ", __lpMsgbuf, se); \
} \
if (__lpMsgbuf) \
{ \
LocalFree( __lpMsgbuf ); \
} \
} \
} \
__n += _snprintf(__sztrace+__n, sizeof(__sztrace)-1-__n, ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//sample : __trace_bytes("profix", pData, cbData) __trace_end;
#define __trace_bytes(Profix, pData, cbData) \
{ \
int __size = cbData * 3 + (Profix == 0 ? 0 : strlen(Profix)) + 32; \
char* __sztrace = (char*)alloca(__size); \
LPBYTE __p = (LPBYTE)pData; \
if (__sztrace) \
{ \
int __n = _snprintf(__sztrace, __size-1, "%s", Profix); \
for (int __l = 0 ; __l < cbData ; __l ++) \
{ \
DWORD __d = (DWORD)__p[__l]; \
__n += _snprintf(__sztrace + __n, __size-1-__n, "%02X ", __d); \
} \
__n += _snprintf(__sztrace + __n, __size-1-__n, "(%d)", cbData); \
__sztrace[__n] = 0; \
__sztrace[__size-1] = 0; \
} ////////////////////////////////////////////////////////////////////////////////////////////////////////////////// #define __FL__ __trace_file "\r\n");__trace_end; ////////////////////////////////////////////////////////////////////////////////////////////////////////////////// #ifdef __dbg__ /////////////////////////////////////////////////////////////////////////////////////////////////////////////////// #define __trace_end_dbg __trace_end #define __trace_dbg __trace #define __trace_file_dbg __trace_file #define __trace_fmt_dbg __trace_fmt /**************************************************************************************************\
* 2009-06-28
显示程序的分支和判断的值
长格式:__if 显示判断的条件的文本
短格式:_if 不显示判断的条件的文本
\**************************************************************************************************/ #define __if_false(x) \
{ \
char __szif[256] = {0}; \
if (!(x)) \
{ \
_snprintf(__szif, sizeof(__szif)-1, "%s/%d %d == ("#x")\r\n", strrchr(__FILE__, '\\') + 1, __LINE__, (x)); \
OutputDebugStringA(__szif); \
} \
} \
if (x) /////////////////////////////////////////////////////////////////////////////////////////////////// #define __if_true(x) \
{ \
char __szif[256] = {0}; \
if (x) \
{ \
_snprintf(__szif, sizeof(__szif)-1, "%s/%d %d == ("#x")\r\n", strrchr(__FILE__, '\\') + 1, __LINE__, (x)); \
OutputDebugStringA(__szif); \
} \
} \
if (x) /////////////////////////////////////////////////////////////////////////////////////////////////// #define __if(x) \
{ \
char __szif[256] = {0}; \
if (x) \
{ \
_snprintf(__szif, sizeof(__szif)-1, "%s/%d %d == ("#x")\r\n", strrchr(__FILE__, '\\') + 1, __LINE__, (x)); \
} \
else \
{ \
_snprintf(__szif, sizeof(__szif)-1, "%s/%d %d == ("#x")\r\n", strrchr(__FILE__, '\\') + 1, __LINE__, (x)); \
} \
OutputDebugStringA(__szif); \
} \
if (x) /////////////////////////////////////////////////////////////////////////////////////////////////// #define _if(x) \
{ \
char __szif[256] = {0}; \
if (x) \
{ \
_snprintf(__szif, sizeof(__szif)-1, "%s/%d %d \r\n", strrchr(__FILE__, '\\') + 1, __LINE__, (x)); \
} \
else \
{ \
_snprintf(__szif, sizeof(__szif)-1, "%s/%d %d \r\n", strrchr(__FILE__, '\\') + 1, __LINE__, (x)); \
} \
OutputDebugStringA(__szif); \
} \
if (x) /////////////////////////////////////////////////////////////////////////////////////////////////////////////////// #else /////////////////////////////////////////////////////////////////////////////////////////////////////////////////// #define _if(x) if(x)
#define __if(x) if(x)
#define __if_true(x) if(x)
#define __if_false(x) if(x)
#define __trace_end_dbg }
#define __trace_dbg if (0) { (
#define __trace_file_dbg if (0) { (
#define __trace_fmt_dbg if (0) { ( /////////////////////////////////////////////////////////////////////////////////////////////////////////////////// #endif /////////////////////////////////////////////////////////////////////////////////////////////////////////////////// #endif

__dbg.h的更多相关文章

  1. 关于 AVI 的一些代码

    #ifndef __HSS_AUTO_REVISE_AVI_FRAMERATE_HSS__ #define __HSS_AUTO_REVISE_AVI_FRAMERATE_HSS__ /******* ...

  2. APUE中fcntl.h的使用及O_SYNC在Mac与Ubuntu下的测试

    此部分测试涉及到APUE V3中,第三章的图3-12到图3-14. 通过fcntl.h提供的功能,修改fd的文件属性,本处增加O_SYNC功能,并测试其效果. 本文涉及代码: tree ch3 ch3 ...

  3. 关于apue.3e中apue.h的使用

    关于apue.3e中apue.h的使用 近来要学一遍APUE第三版,并于此开博做为记录. 先下载源文件: # url: http://http//www.apuebook.com/code3e.htm ...

  4. YYModel 源码解读(二)之NSObject+YYModel.h (1)

    本篇文章主要介绍 _YYModelPropertyMeta 前边的内容 首先先解释一下前边的辅助函数和枚举变量,在写一个功能的时候,这些辅助的东西可能不是一开始就能想出来的,应该是在后续的编码过程中 ...

  5. YYModel 源码解读(一)之YYModel.h

    #if __has_include(<YYModel/YYModel.h>) FOUNDATION_EXPORT double YYModelVersionNumber; FOUNDATI ...

  6. error RC1015: cannot open include file 'afxres.h' 解决办法

    在为WindowsPhone8程序添加本地化的过程中遇到这个问题: 问题原因就是afxres.h文件缺失,下载它,放到VS安装目录下的VS\include目录下就可以了(选择目录的时候注意对应对版本) ...

  7. afxcomctl32.h与afxcomctl32.inl报错

    afxcomctl32.h与afxcomctl32.inl报错 编译公司一个几年前的老项目,是从VC6.0升级到VS2005的. 1.编译时报缺少头文件,于是附件包含目录,于是出现了以下报错: 1&g ...

  8. C标准头文件<math.h>

    定义域错误可以理解为超出了函数的适用范围,如果发生了定义域错误,设errno为EDOM 如果结果不能表示为double值,则发生值域错误,如果结果上溢,则函数返回HUGE_VAL的值,设errno为E ...

  9. C标准头文件<ctype.h>

    主要包括了一些字符识别和转换函数 字符判断 isalnum() //函数原型 #include<ctype.h> int isalum(int c); 功能:如果输入的字符是字母(alph ...

随机推荐

  1. 02.Web大前端时代之:HTML5+CSS3入门系列~H5结构元素

    Web大前端时代之:HTML5+CSS3入门系列:http://www.cnblogs.com/dunitian/p/5121725.html 1.结构元素 可以理解为语义话标记,比如:以前这么写&l ...

  2. 【.net深呼吸】WPF异步加载大批量图像

    如何在WPF中加载大批量数据,并且不会阻塞UI线程,尤其是加载大量图片时,这活儿一直是很多朋友都相当关注的.世上没有最完美的解决之道,咱们但求相对较优的方案. 经过一些试验和对比,老周找到了一种算是不 ...

  3. PHP 面向对象编程和设计模式 (3/5) - 单例模式和工厂模式

    PHP高级程序设计 学习笔记 2014.06.11 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容 ...

  4. HTML自定义对象与属性(谷歌,火狐,IE9浏览器没问题)

    1.自定义标签 <zqz>asdas</zqz> <style> zqz{ color:red; } </style> 页面变色 2.自定义标签的hov ...

  5. 返回顶部的功能 div固定在页面位置不变

    1.你在网上搜索的时候,可能会搜索到div固定在页面上,不随滚动条滚动而滚动是用CSS写的,写法是position:fixed;bottom:0; 但是这个在iframe满地跑的页面实际开发中,有啥用 ...

  6. Mono的简单例子

    一直对移动端开发有些兴趣,但苦于不会Java,好在终于找到了个好玩的. 安装方法略了,先建立一个玩玩 不多说,贴代码了,需要注意的只有些JAVA和C#写法不太一样的地方,不细介绍了,因为没什么经验,乱 ...

  7. Vertica 安装,建库,新建测试用户并授予权限,建表,入库

    测试环境:RHEL 6.4 + Vertica 6.1.3-7 需求:搭建Vertica数据库3节点的测试环境,建立测试用户,建表,测试数据入库. 1.各节点关闭防火墙和SELinux,配置主机名,I ...

  8. C#基础回顾(三)—索引器、委托、反射

    一.前言                                                                                       ------人生路 ...

  9. 使用h5的history改善ajax列表请求体验

    信息比较丰富的网站通常会以分页显示,在点“下一页”时,很多网站都采用了动态请求的方式,避免页面刷新.虽然大家都是ajax,但是从一些小的细节还是 可以区分优劣.一个小的细节是能否支持浏览器“后退”和“ ...

  10. GridView详细介绍

    GridView控件的属性 表10.6 GridView控件的行为属性属性描述AllowPaging指示该控件是否支持分页.AllowSorting指示该控件是否支持排序.AutoGenerateCo ...