使用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);
}
|
阅读(3570) | 评论(0) | 转发(0) |