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