前面声明过va_list ap;后面出现了va_start (ap, fmt),va_arg (ap, int)。fmt 和 int 是啥参数啊?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了前面声明过va_list ap;后面出现了va_start (ap, fmt),va_arg (ap, int)。fmt 和 int 是啥参数啊?相关的知识,希望对你有一定的参考价值。

参考技术A 给个例子自己看:

四个重要的宏: va_list va_start va_arg va_end
va_list 定义了参数列表
va_start 指定列表开始的参数
va_arg 取出列表中的参数, 顺序为函数传递参数顺序(从左到右)
va_end 参数列表结束
举例:
#include <iostream>
#include <stdarg.h>
using namespace std;
int add(int totalnum...)//totalnum指定了参数的个数,...表示参数不定, 为定义此类函数必需

va_list intlist;//定义参数表 intlist
va_start(intlist, totalnum);//指定开始参数为totalnum
int totaladd = 0;
for(int i=0;i<totalnum;i++)

totaladd += va_arg(intlist,int);//取出参数类型为int的参数 你说的fmt是参数的类型如float等

va_end(intlist);//参数取完
return totaladd;

void main()

cout<<add(5,1,2,3,4,5)<<endl;

答案为15本回答被提问者和网友采纳
参考技术B 主要是va_start(),va_end(), va_arg()函数的用法。具体的你可以去查相关的文档,这里我给一个简单的例子:arg_test()是一个带不确定参数的函数,具体的处理在args_process()里,处理过程是根据fmt里指出的“类型”,把参数一个个打印出来。

#include <stdio.h>
#include <stdarg.h>

void args_process(const char *fmt, va_list &va)

while (*fmt)

switch (*fmt)

case 's':
printf("s = %s\n", va_arg(va, const char *));
break;
case 'd':
printf("d = %d\n", va_arg(va, int));
break;
case 'f':
printf("g = %.2g\n", va_arg(va, double));
break;
default:
break;

fmt++;



void arg_test(const char *fmt, ...)

va_list va;

va_start(va, fmt);

args_process(fmt, va);

va_end(va);


int main()

arg_test("dfs", 2, 3.14, "hahah");
return 0;

可变参数编程

可变参数列表是通过宏来实现的,这些宏定义于stdarg.h 头文件中。

这个头文件声明了一个类型va_list 和 三个宏  va_start  、va_arg 和 va_end。

我们可以声明一个类型为va_list 的变量,与这几个宏配合使用,访问参数的值。

 

 

1、求平均值

 

2、求最大值

 

3、实现一个简化的print 函数

void Print(char *str,...)
{
 va_list list;
 va_start(list,str);
 char ch;
 char *p;
 int m;
 double n;
 while(*str != \'\\0\')
 {
  if(*str == \'%\')
  {
   switch(*(str+1))
   {
   case \'c\': ch = va_arg(list,char);
             putchar(ch);
          str += 2;
          break;
      case \'s\': p = va_arg(list,char*);
             printf("%s",p);
          str += 2;
          break;
      case \'d\': m = va_arg(list,int);
             printf("%d",m);
          str += 2;
          break;
      case \'f\': n = va_arg(list,double);
             printf("%f",n);
          str += 2;
          break;
      default : putchar(*str++);
             break;
   }
  }
  else
   putchar(*str++);
 }
}

int main()
{
 char *p = "avc";
 int b = 9;
 double m = 0.9;
 char c = \'a\';
 Print("%s,%d,%c,%f\\n",p,b,c,m);
}

 

以上是关于前面声明过va_list ap;后面出现了va_start (ap, fmt),va_arg (ap, int)。fmt 和 int 是啥参数啊?的主要内容,如果未能解决你的问题,请参考以下文章

可变参数列表

可变参函数

可变參数列表

c++使用不定参数

可变参数编程

C语言怎么实现可变参数?