Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3920800
  • 博文数量: 534
  • 博客积分: 10470
  • 博客等级: 上将
  • 技术积分: 4800
  • 用 户 组: 普通用户
  • 注册时间: 2006-05-26 14:08
文章分类

全部博文(534)

文章存档

2024年(1)

2021年(1)

2019年(1)

2017年(1)

2016年(2)

2013年(2)

2012年(10)

2011年(43)

2010年(10)

2009年(17)

2008年(121)

2007年(252)

2006年(73)

分类:

2007-10-17 22:21:34

  使用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);
}

阅读(3538) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~