C++ Reference: Standard C++ Library reference: C Library: cstdarg: va_arg
C++官网参考链接:https://cplusplus.com/reference/cstdarg/va_arg/
宏
<cstdarg>
va_arg
type va_arg (va_list ap, type)
获取下一个实参
这个宏展开为一个类型为type的表达式,其中包含由ap标识的可变实参列表中的当前实参的值。
对该宏的每次调用都会修改ap的状态,以便下一次对该宏的调用将展开到它计算结果的实参之后的实参。
注意,va_arg不能确定传递给函数的实参的实际类型,而是使用作为type宏实参传递的任何类型作为其类型。
还要注意,va_arg也不确定检索到实参是否是传递给函数的最后一个实参(甚至也不确定它是否是超出列表末尾的元素)。函数应该这样设计:可以通过指定命名形参的值或已经读取的附加实参的值以某种方式推断形参的数量。
参数
ap
类型为va_list的对象携带关于可变实参列表的当前检索状态的信息。该对象应该通过对va_start或va_copy的初始调用进行初始化,而且还没有用va_end释放。
type
一个类型的名字。此类型名用作此宏展开到的表达式的类型(即其返回类型)。要使类型表达式适合与va_arg一起使用,必须使type*产生指向type的指针。类型必须与提取的实参的类型兼容(按照默认实参提升的方式提升),或者一个是另一个的无符号版本,或者一个是void指针,另一个是其他指针类型。
返回值
返回当前附加实参作为类型type的表达式。
用例
/* 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;
}
这个FindMax函数的第一个形参是它将获得的附加实参的数量。检索第一个附加实参并将其用作比较的初始引用,然后在循环中检索其余附加实参并进行比较以返回最大的一个(在本例中为892)。
输出:
另请参考
va_start Initialize a variable argument list (macro) (初始化一个可变实参列表(宏))
va_end End using variable argument list (macro) (结束使用可变实参列表(宏))
va_list Type to hold information about variable arguments (type) (保存关于可变实参信息的类型(类型))
vsprintf Write formatted data from variable argument list to string (function) (从可变实参列表写入格式化数据到字符串(函数))