VARARGS(3)                                                          VARARGS(3)


NAME
       varargs - variable argument list

SYNOPSIS
       #include <varargs.h>

       function(va_alist)
       va_dcl
       va_list pvar;
       va_start(pvar);
       f = va_arg(pvar, type);
       va_end(pvar);

DESCRIPTION
       This set of macros provides a means of writing portable procedures that
       accept variable argument  lists.   Routines  having  variable  argument
       lists  (such  as printf(3)) that do not use varargs are inherently non‐
       portable, since different machines use different argument passing  con‐
       ventions.

       va_alist  is  used  in a function header to declare a variable argument
       list.

       va_dcl is a declaration for va_alist.  Note that there is no  semicolon
       after va_dcl.

       va_list  is  a  type  which can be used for the variable pvar, which is
       used to traverse the list.  One such variable must always be  declared.

       va_start(pvar)  is  called  to  initialize pvar to the beginning of the
       list.

       va_arg(pvar, type) will return the next argument in the list pointed to
       by  pvar.  Type is the type to which the expected argument will be con‐
       verted when passed as an argument.  In standard C, arguments  that  are
       char  or  short  should  be  accessed as int, unsigned char or unsigned
       short are converted to unsigned int, and float arguments are  converted
       to  double.   Different types can be mixed, but it is up to the routine
       to know what type of argument is expected, since it  cannot  be  deter‐
       mined at runtime.

       va_end(pvar) is used to finish up.

       Multiple traversals, each bracketed by va_start ...  va_end, are possi‐
       ble.

EXAMPLE
            #include <varargs.h>
            execl(va_alist)
            va_dcl
            {
                 va_list ap;
                 char *file;
                 char *args[100];
                 int argno = 0;

                 va_start(ap);
                 file = va_arg(ap, char *);
                 while (args[argno++] = va_arg(ap, char *))
                      ;
                 va_end(ap);
                 return execv(file, args);
            }

BUGS
       It is up to the calling routine to determine how many  arguments  there
       are,  since  it is not possible to determine this from the stack frame.
       For example, execl passes a 0 to signal the end of  the  list.   Printf
       can tell how many arguments are supposed to be there by the format.

       The macros va_start and va_end may be arbitrarily complex; for example,
       va_start might contain an opening brace, which is closed by a  matching
       brace  in  va_end.   Thus, they should only be used where they could be
       placed within a single complex statement.


7th Edition                      May 15, 1986                       VARARGS(3)
 
Generated: 2016-12-26
Generated by man2html V0.25
page hit count: 684
Valid CSS Valid XHTML 1.0 Strict