<cstdarg>

va_arg

type va_arg (va_list ap, type)
检索下一个参数
此宏展开为一个类型为 type 的表达式,其值为由 ap 标识的可变参数列表中的当前参数

每次调用此宏都会修改 ap 的状态,以便下一次调用此宏时会展开为它所求值的参数之后的那个参数。

请注意,va_arg 无法确定传递给函数的参数的实际类型,而是使用作为 type 宏参数传递的任何类型作为其类型。

另请注意,va_arg 既不确定检索到的参数是否是传递给函数的最后一个参数(甚至不确定它是否是该列表末尾之外的元素)。函数的设计方式应该能够通过命名参数的值或已经读取的附加参数的值以某种方式推断出参数的数量。

参数

ap
类型为 va_list 的对象,携带有关可变参数列表当前检索状态的信息。此对象应已通过对 va_startva_copy 的初始调用进行初始化,并且尚未用 va_end 释放。
类型
一个类型名称。此类型名称用作该宏展开的表达式的类型(即其返回类型)。
要使一个类型表达式适合与 va_arg 一起使用,它必须是这样的类型,即 type* 会产生一个指向 type 的指针。
type 应与提取的参数的类型(根据默认参数提升规则提升后的类型)兼容,或者一个是另一个的无符号版本,或者一个是空指针而另一个是某种其他指针类型。

返回值

返回当前的附加参数,作为 type 类型的表达式。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
/* 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)。

输出
The largest value is: 892


另见