Node:Argument Macros, Next:Old Varargs, Previous:Calling Variadics, Up:How Variadic
Here are descriptions of the macros used to retrieve variable arguments. 
These macros are defined in the header file stdarg.h.
| va_list | Data Type | 
The type va_list is used for argument pointer variables. 
 | 
| void va_start (va_list ap, last-required) | Macro | 
| 
This macro initializes the argument pointer variable ap to point
to the first of the optional arguments of the current function;
last-required must be the last required argument to the function.
 See Old Varargs, for an alternate definition of   | 
| type va_arg (va_list ap, type) | Macro | 
The va_arg macro returns the value of the next optional argument,
and modifies the value of ap to point to the subsequent argument. 
Thus, successive uses of va_arg return successive optional
arguments.
The type of the value returned by   | 
| void va_end (va_list ap) | Macro | 
This ends the use of ap.  After a va_end call, further
va_arg calls with the same ap may not work.  You should invoke
va_end before returning from the function in which va_start
was invoked with the same ap argument.
In the GNU C library,   | 
Sometimes it is necessary to parse the list of parameters more than once
or one wants to remember a certain position in the parameter list.  To
do this, one will have to make a copy of the current value of the
argument.  But va_list is an opaque type and one cannot necessarily
assign the value of one variable of type va_list to another variable
of the same type.
| void __va_copy (va_list dest, va_list src) | Macro | 
The __va_copy macro allows copying of objects of type
va_list even if this is not an integral type.  The argument pointer
in dest is initialized to point to the same argument as the
pointer in src.
This macro is a GNU extension but it will hopefully also be available in the next update of the ISO C standard.  | 
If you want to use __va_copy you should always be prepared for the
possibility that this macro will not be available.  On architectures where a
simple assignment is invalid, hopefully __va_copy will be available,
so one should always write something like this:
{
  va_list ap, save;
  ...
#ifdef __va_copy
  __va_copy (save, ap);
#else
  save = ap;
#endif
  ...
}