outputdebugstring函数的封装
使用debugview分析问题时,outputdebugstring函数可以在debug和release版本中都显示信息,这比trace更加实用,但前提是你必须将它的参数形式修改成和trace或printf函数一样,下面给出简单修改后的函数形式,并利用宏定义实现日志输出:
int DebugPrintf(LPCTSTR ptzFormat, ...)
{va_list vlArgs;TCHAR tzText[1024];va_start(vlArgs, ptzFormat);//返回-1说明缓存不够 使用下面方式获取实际所需长度//int iRealSize= _vsntprintf(NULL,0, ptzFormat, vlArgs);int iRet= _vsntprintf(tzText,1024, ptzFormat, vlArgs);if (iRet<0){tzText[1023] = '\0';}OutputDebugString(tzText); va_end(vlArgs);return iRet;
}#define LOG_PRINTF DebugPrintf#define CONSTSTR_DEBUG "[DEBUG] "
#define CONSTSTR_INFO "[INFO] "
#define CONSTSTR_WARNING "[WARNING] "
#define CONSTSTR_ERROR "[ERROR] "#define LOGLEVEL_DEBUG 1
#define LOGLEVEL_INFO 2
#define LOGLEVEL_WARN 3
#define LOGLEVEL_ERROR 4int AppLogLevel()
{static int iLogLevel =-1;if(iLogLevel<0){iLogLevel = GetPrivateProfileInt(_T("log"),_T("level"),0, _T("log_config.ini"));}return iLogLevel;
}#define APPLOG_DEBUG(s,...) { if(AppLogLevel()<=LOGLEVEL_DEBUG){ LOG_PRINTF(CONSTSTR_DEBUG s "\r\n", ##__VA_ARGS__); } }
#define APPLOG_INFO(s,...) { if(AppLogLevel()<=LOGLEVEL_INFO) { LOG_PRINTF(CONSTSTR_DEBUG s "\r\n", ##__VA_ARGS__); } }
#define APPLOG_WARN(s,...) { if(AppLogLevel()<=LOGLEVEL_WARN) { LOG_PRINTF(CONSTSTR_DEBUG " FILE: " __FILE__ " LINE:%d," s "\r\n",__LINE__, ##__VA_ARGS__); } }
#define APPLOG_ERROR(s,...) { if(AppLogLevel()<=LOGLEVEL_ERROR){ LOG_PRINTF(CONSTSTR_DEBUG " FILE: " __FILE__ " LINE:%d," s "\r\n",__LINE__, ##__VA_ARGS__); } }#define MOUDULE_LOG_DEBUG(s,...) APPLOG_DEBUG("[MOUDLE_LOGTEST] " s ,##__VA_ARGS__);int _tmain(int argc, _TCHAR* argv[])
{APPLOG_DEBUG("my name is %s ","handsome boy");MOUDULE_LOG_DEBUG("my name is %s ","handsome boy");APPLOG_ERROR("my name is %s ","handsome boy");return 0;
}
呵呵,不保证没bug噢
outputdebugstring函数的封装相关推荐
- 函数模板案例_利用函数模板封装一个排序的函数,可以对不同数据类型数组进行排序 排序规则从大到小,排序算法为选择排序 分别利用char数组和int数组进行测试
案例描述: 利用函数模板封装一个排序的函数,可以对不同数据类型数组进行排序 排序规则从大到小,排序算法为选择排序 分别利用char数组和int数组进行测试 #include <iostream& ...
- python语言学习:python语言学习中的定义类、定义函数、封装api等详细攻略
python语言学习:python语言学习中的定义类.定义函数.封装api等详细攻略 目录 python语言学习中的定义类 python语言学习中的定义函数 python语言学习中封装api pyth ...
- NLP:两种方法(自定义函数和封装函数)实现提取两人对话内容(***分隔txt文档),并各自保存为txt文档
NLP:两种方法(自定义函数和封装函数)实现提取两人对话内容(***分隔txt文档),并各自保存为txt文档 目录 问题探究 实现代码 问题探究 实现代码 f=open("niu.txt&q ...
- fcntl函数完成 set_fl()函数还有clr_fl()函数的封装
使用fcntl函数完成,set_fl和clr_fl()函数的封装,设置文件的属性,例如:阻塞IO模型 和 非阻塞IO模型 #include <stdio.h> #include " ...
- 套接字错误处理函数的封装思想及函数实现
一.套接字错误处理函数的封装思想 在上篇文章中的 CS 模型,存在 bug: 先关 server,再关 client,立即再启动 server,此时会发现无法启动.原因是:先关 server,再关 c ...
- php怎么上传函数,PHP单文件上传原理及上传函数的封装操作示例
搜索热词 @H_404_0@本文实例讲述了PHP单文件上传原理及上传函数的封装操作.分享给大家供大家参考,具体如下: @H_404_0@表单: @H_404_0@0.PHP: 无标题文档 请选择您要上 ...
- php怎么上传函数,php上传函数怎么封装
php上传函数怎么封装? <?php //上传文件调用 $file = $_FILES['image']; //允许上传的类型 $allow = array('image/jpeg', 'ima ...
- python封装一个函数并调用_python - 函数的封装与调用
一.函数的定义,函数名,函数体以及函数的调用 1.函数的定义语法: def 函数名(): 函数体 2.函数名的定义与变量名命名一样 3.函数的封装与调用 #函数的封装 defyue():print(' ...
- JAVA之旅(五)——this,static,关键字,main函数,封装工具类,生成javadoc说明书,静态代码块...
JAVA之旅(五)--this,static,关键字,main函数,封装工具类,生成javadoc说明书,静态代码块 周末收获颇多,继续学习 一.this关键字 用于区分局部变量和成员变量同名的情况 ...
最新文章
- 每日一皮:程序员距离人生目标只有一个沟
- My First Window构造过程,SendMessage同步,PostMessage异步
- 如何建立论坛的核心用户--引发的思考
- 跨语言RPC框架Thrift详解
- 我们在进行着一场拔河比赛……
- centos6.5搭建git服务器 win10 安装git客户端连接 和遇到的问题+解决方式
- 数据库水平切分(MyCat分片)
- 【BZOJ1815BZOJ1488】有色图图的同构,Polya计数+暴力
- PotPlayer:最强播放器,无边框
- Docker学习总结(35)——Docker全面认识再总结
- Linux Ubuntu编译内核错误,安装ubuntu以后,编译kernel出错
- java判断浏览器类型_判断浏览器类型
- html5 字段换行,关于换行以及换行属性
- FFT蝶形算法,IFFT
- gulp项目找不到html标签,通过yeoman、gulp、angular编写前段时的html模板处理,打包后找不到html的问题解决...
- 如何在Nginx上 安装SSL证书
- 虚拟语气在条件句中的应用
- 5.15-19采集麦克风的声音信号
- 在windows本地创建svn及遇到错误:svn create repository here 报错
- 我的理想计算机软件设计师,我的理想设计师