C语言中解决变参问题的几个宏

来源:互联网 发布:c语言重点知识总结 编辑:程序博客网 时间:2024/05/20 03:05

#include <stdio.h>

#include <stdarg.h>

int demo(char* msg,...)
{
 va_list argp;
 int argno = 0;
 int para;
 va_start(argp,msg);
 do{
  para = va_arg(argp,int);
  printf("Parameter #%d is:%d\n",argno,para);
  argno++;
 }while(para != 0);
 va_end(argp);
 return 0;
}

 

int _tmain(int argc, _TCHAR* argv[])
{
 demo("DEMO",5,4,3,2,0);
 system("pause");
}

 

VA_LIST的用法:     
       (1)首先在函数里定义一具VA_LIST型的变量,这个变量是指向参数的指针;
       (2)然后用VA_START宏初始化变量刚定义的VA_LIST变量;
       (3)然后用VA_ARG返回可变的参数,VA_ARG的第二个参数是你要返回的参数的类型(如果函数有多个可变参数的,依次调用VA_ARG获取各个参数);
       (4)最后用VA_END宏结束可变参数的获取。
使用VA_LIST应该注意的问题:
   (1)可变参数的类型和个数完全由程序代码控制,它并不能智能地识别不同参数的个数和类型;
   (2)如果我们不需要一一详解每个参数,只需要将可变列表拷贝至某个缓冲,可用vsprintf函数;
   (3)因为编译器对可变参数的函数的原型检查不够严格,对编程查错不利.不利于我们写出高质量的代码;

小结:可变参数的函数原理其实很简单,而VA系列是以宏定义来定义的,实现跟堆栈相关。我们写一个可变参数的C函数时,有利也有弊,所 以在不必要的场合,我们无需用到可变参数,如果在C++里,我们应该利用C++多态性来实现可变参数的功能,尽量避免用C语言的方式来实现。

 

vsprintf

  /* 函数名: vsprintf
  功 能: 送格式化输出到串中
  返回值: 正常情况下返回生成字串的长度(除去\0),错误情况返回负值
  用 法: int vsprintf(char *string, char *format, va_list param);
  // 将param 按格式format写入字符串string中
  注: 该函数会出现内存溢出情况,建议使用vsnprintf
  程序例:
  */
  #include <stdarg.h>
  char buffer[80];
  int vspf(char *fmt, ...)
  {
  va_list argptr;
  int cnt;
  va_start(argptr, fmt);
  cnt = vsprintf(buffer, fmt, argptr);
  va_end(argptr);
  return(cnt);
  }
  int main(void)
  {
  int inumber = 30;
  float fnumber = 90.0;
  char string[4] = "abc";
  vspf("%d %f %s", inumber, fnumber, string);
  printf("%s\n", buffer);
  return 0;
  }
  该程序结果为
  30 90.000000 abc
原创粉丝点击