使用linux下的可变参数宏来进行记录debug或日志信息感觉很不错:
如:
#define va_debug_print(fmt, a...) printf("enter %s():" fmt "\n", __function__, ##a)
很遗憾的是windows下不知道怎么实现:
1>. 没办法定义可变参数的宏(应该是编译器vc不支持,说具体点应该是哪个cl.exe不支持,毕竟vc是个集成的开发工具) 2>. __function__宏也没有实现, 麻烦! 所以在windows下来debug时要输出什么信息还得使用下面的函数比较好点!
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdarg.h>
#define va_max_len 512
#ifdef _win32
#define vsnprinf _vsnprintf
#define vsprinf _vsprintf
#endif
static int va_debug_print(const char *fmt, ...)
{
int t;
char out[1024];
va_list ap;
/*
test env:
gcc version 3.4.5 20051201 (red hat 3.4.5-2)
result:
使用vsprintf时:
当fmt的长度大于1024时出现: 段错误
当fmt的长度小于1024时出现: 正常
使用vsnprintf时:
当fmt的长度大于1024时出现: 多余的字符不保存到out中
当fmt的长度小于1024时出现: 正常
vsnprintf的返回值同snprintf很相似
---------------------------------------------------
test env:
microsoft windows xp [版本 5.1.2600]
microsoft (r) 32-bit c/c optimizing compiler version 12.00.8168 for 80x86
result:
使用_vsprintf时:
当fmt的长度大于1024时出现: 段错误
当fmt的长度小于1024时出现: 正常
使用_vsnprintf时:
当fmt的长度大于1024时出现: 多余的字符不保存到out中
当fmt的长度小于1024时出现: 正常
_vsnprintf的返回值同_snprintf很相似
*/
va_start(ap, fmt);
t = vsnprintf(out, 1024, fmt, ap);
va_end(ap);
printf("va_debug_print==> %s\n", out);
return (t);
}
int main(int argc, char **argv)
{
int i, t;
char str[va_max_len];
for (i = 0; i < va_max_len; i)
str[i] = 'a';
str[i-1] = '\0';
printf("strlen.%d i.%d \n", strlen(str), i);
t = va_debug_print("new string is.%s", str);
printf("va_debug_print() ret.%d \n", t);
return (0);
}
|
阅读(3555) | 评论(0) | 转发(0) |