The <stdarg.h> header file declares a type and defines
three macros for advancing through a list of function arguments of
varying number and type.
va_list
va_start , va_arg , and va_
end .
To access varying arguments, the called function must declare an
object (referred to as ap in this section) that has the
type va_list :
va_list ap;
The object ap can be passed as an argument to another
function. If that function invokes the va_arg macro
with parameter ap, the value of ap in the
calling function is indeterminate and is passed to the va_
end macro before any further reference to ap.
void va_start(va_list ap, parmN);
va_
arg and va_end . The va_start
macro must be invoked before any access to the unnamed arguments.
The parameter parmN is the identifier of the
rightmost parameter in the variable parameter list of the
function definition. If parmN is declared with the
register storage class, with a function or array
type, or with a type that is not compatible with the type that
results after application of the default arguments promotions,
the behavior is undefined. The va_start macro
returns no value.
type va_arg(va_list ap,
type);
va_list ap that was initialized by
va_start . Each invocation of va_arg
modifies ap so that the values of successive arguments
are returned in turn. The parameter type is a type name
specified such that the type of a pointer to an object that has
the specified type can be obtained by postfixing an asterisk (*)
to type. The behavior is undefined if there is no actual
next argument, or if type is not compatible with the
type of the next actual argument (as promoted according to the
default argument promotions).
The first invocation of va_arg after that of
va_start returns the value of the argument after
that specified by parmN. Successive invocations return
the values of the remaining arguments in turn.
void va_end(va_list ap);
va_start that initialized the va_list
ap object. The va_end macro can modify
ap so that it can no longer be used (without an
intervening invocation of va_start ). If there is no
corresponding invocation of va_start or if va_
end is not invoked before the return, the behavior is
undefined. The va_end macro returns no value.