(libc.info.gz) Calling Variadics
Info Catalog
(libc.info.gz) How Many Arguments
(libc.info.gz) How Variadic
(libc.info.gz) Argument Macros
A.2.2.4 Calling Variadic Functions
..................................
You don't have to do anything special to call a variadic function. Just
put the arguments (required arguments, followed by optional ones) inside
parentheses, separated by commas, as usual. But you must declare the
function with a prototype and know how the argument values are
converted.
In principle, functions that are _defined_ to be variadic must also
be _declared_ to be variadic using a function prototype whenever you
call them. ( Variadic Prototypes, for how.) This is because
some C compilers use a different calling convention to pass the same set
of argument values to a function depending on whether that function
takes variable arguments or fixed arguments.
In practice, the GNU C compiler always passes a given set of argument
types in the same way regardless of whether they are optional or
required. So, as long as the argument types are self-promoting, you can
safely omit declaring them. Usually it is a good idea to declare the
argument types for variadic functions, and indeed for all functions.
But there are a few functions which it is extremely convenient not to
have to declare as variadic--for example, 'open' and 'printf'.
Since the prototype doesn't specify types for optional arguments, in
a call to a variadic function the "default argument promotions" are
performed on the optional argument values. This means the objects of
type 'char' or 'short int' (whether signed or not) are promoted to
either 'int' or 'unsigned int', as appropriate; and that objects of type
'float' are promoted to type 'double'. So, if the caller passes a
'char' as an optional argument, it is promoted to an 'int', and the
function can access it with 'va_arg (AP, int)'.
Conversion of the required arguments is controlled by the function
prototype in the usual way: the argument expression is converted to the
declared argument type as if it were being assigned to a variable of
that type.
Info Catalog
(libc.info.gz) How Many Arguments
(libc.info.gz) How Variadic
(libc.info.gz) Argument Macros
automatically generated by
info2html