可变参数宏的使用-凯发app官方网站

凯发app官方网站-凯发k8官网下载客户端中心 | | 凯发app官方网站-凯发k8官网下载客户端中心
  • 博客访问: 3977345
  • 博文数量: 536
  • 博客积分: 10470
  • 博客等级: 上将
  • 技术积分: 4825
  • 用 户 组: 普通用户
  • 注册时间: 2006-05-26 14:08
文章分类

全部博文(536)

文章存档

2024年(3)

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

阅读(3555) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
")); function link(t){ var href= $(t).attr('href'); href ="?url=" encodeuricomponent(location.href); $(t).attr('href',href); //setcookie("returnouturl", location.href, 60, "/"); }
网站地图