(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