cstdarg
header
#include <cstdarg>
// or
#include <stdarg.h>
这个头文件定义了一些宏来处理那些参数数量和数据类型不明确的函数调用的情况。
通过在其常规命名参数后包含逗号和三个点(,…),函数可以接受不同数量的附加参数,而无需相应的参数声明:
就像下面的形式
return_type function_name ( parameter_declarations , ... );
要访问这些附加参数,可以使用此标题中声明的宏va_start、va_arg和va_end:
steps
1.va_start将变量参数列表初始化为va_list。
2. 随后对va_arg的执行会产生附加参数的值,其顺序与传递给函数的顺序相同。
3. 在函数返回之前执行va_end。
va_list ap;
va_start(ap, args1); // 1
get_type_obj = va_arg(ap, want_get_type); // 2
va_end(ap);
type
va_list | type to hold information about variable arguments (type ) |
Macro functions
va_start | 初始化变量参数列表 |
va_arg | 检索下一个参数 |
va_copy | 复制参数列表 |
初始化,va_list ap 从 parameter paramN 开始。
示例
/* va_start example */
#include <stdio.h> /* printf */
#include <stdarg.h> /* va_list, va_start, va_arg, va_end */
void PrintFloats (int n, ...)
{
int i;
double val;
printf ("Printing floats:");
va_list vl;
va_start(vl,n);
for (i=0;i<n;i++)
{
val=va_arg(vl,double);
printf (" [%.2f]",val);
}
va_end(vl);
printf ("\n");
}
int main ()
{
PrintFloats (3,3.14159,2.71828,1.41421);
return 0;
}
/* va_arg example */
#include <stdio.h> /* printf */
#include <stdarg.h> /* va_list, va_start, va_arg, va_end */
int FindMax (int n, ...)
{
int i,val,largest;
va_list vl;
va_start(vl,n);
largest=va_arg(vl,int);
for (i=1;i<n;i++)
{
val=va_arg(vl,int);
largest=(largest>val)?largest:val;
}
va_end(vl);
return largest;
}
int main ()
{
int m;
m= FindMax (7,702,422,631,834,892,104,772);
printf ("The largest value is: %d\n",m);
return 0;
}
/* va_end example */
#include <stdio.h> /* puts */
#include <stdarg.h> /* va_list, va_start, va_arg, va_end */
void PrintLines (char* first, ...)
{
char* str;
va_list vl;
str=first;
va_start(vl,first);
do {
puts(str);
str=va_arg(vl,char*);
} while (str!=NULL);
va_end(vl);
}
int main ()
{
PrintLines ("First","Second","Third","Fourth",NULL);
return 0;
}
/* va_copy example */
#include <stdio.h> /* printf, vprintf*/
#include <stdlib.h> /* malloc */
#include <string.h> /* strlen, strcat */
#include <stdarg.h> /* va_list, va_start, va_copy, va_arg, va_end */
/* print ints until a zero is found: */
void PrintInts (int first,...)
{
char * buffer;
const char * format = "[%d] ";
int count = 0;
int val = first;
va_list vl,vl_count;
va_start(vl,first);
/* count number of arguments: */
va_copy(vl_count,vl);
while (val != 0) {
val=va_arg(vl_count,int);
++count;
}
va_end(vl_count);
/* allocate storage for format string: */
buffer = (char*) malloc (strlen(format)*count+1);
buffer[0]='\0';
/* generate format string: */
for (;count>0;--count) {
strcat (buffer,format);
}
/* print integers: */
printf (format,first);
vprintf (buffer,vl);
va_end(vl);
}
int main ()
{
PrintInts (10,20,30,40,50,0);
return 0;
}