macro
<cstdarg>

va_arg

type va_arg (va_list ap, type)
Retrieve next argument
This macro expands to an expression of type type with the value of the current argument in the variable arguments list identified by ap.

Each call to this macro modifies the state of ap so that the next call to this macro will expand to the argument that follows the one it evaluates to.

Notice that va_arg cannot determine the actual type of the argument passed to the function, but uses whatever type is passed as the type macro argument as its type.

Notice also that va_arg does not determine either whether the retrieved argument is the last argument passed to the function (or even if it is an element past the end of that list). The function should be designed in such a way that the number of parameters can be inferred in some way by the values of either the named parameters or the additional arguments already read.

Parameters

ap
Object of type va_list carrying information about the current retrieval state of a variable argument list. This object shall have been initialized by an initial call to va_start or va_copy and not have been released with va_end.
type
A type name. This type name is used as the type of the expression this macro expands to (i.e., its return type).
For a type expression to be suitable for its use with va_arg, it must be such that type* produces a pointer to type.
The type shall be compatible with type of the extracted argument (as promoted according to the default argument promotions), or one be the unsigned version of the other, or one be a void pointer and the other some other pointer type.

Return Value

Returns the current additional argument as an expression of type type.

Example

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;
}


This FindMax function takes as its first parameter the number of additional arguments it is going to get. The first additional argument is retrieved and used as an initial reference for comparison, and then the remaining additional arguments are retrieved in a loop and compared to return the greatest one (which in this case is 892).

Output:
The largest value is: 892

See also