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.