|
VMS Help CXX, Language Topics, Variable Length Argument Lists *Conan The Librarian |
The set of functions and macros defined and declared in the
<varargs.h> and the <stdarg.h> header files provide a method
of accessing variable-length argument lists. (Note that the
<stdarg.h> functions are defined by the ANSI C++ standard and
are, therefore, portable as compared with those defined in
<varargs.h>.)
The C++ RTL functions such as printf and execl, for example,
use variable-length argument lists. User-defined functions with
variable-length argument lists that do not use <varargs.h> or
<stdarg.h> are not portable due to the different argument-passing
conventions of various machines.
To use these functions and macros in <stdarg.h>, you must include
the <stdarg.h> header file with the following preprocessor
directive:
#include <stdarg.h>
The <stdarg.h> header file declares a type (va_list) and three
macros (va_start, va_arg, and va_end) for advancing through a
list of function arguments of varying number and type. The macros
have the following syntax:
void va_start(va_list ap, parmN);
type va_arg(va_list ap, type);
void va_end(va_list ap);
The va_start macro initializes the object ap of type va_list
for subsequent use by 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.
The va_arg macro expands to an expresion that has the type and
value of the next argument in the call. The parameter ap is the
same as the one 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". 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 behavior
is undefined. 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.
The va_end macro facilitates a normal return from the function
whose variable argument list was referred to by the expansion
of 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.
|
|