前面声明过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 是啥参数啊?的主要内容,如果未能解决你的问题,请参考以下文章