unixdev.net


Switch to SpeakEasy.net DSL

The Modular Manual Browser

Home Page
Manual: (4.2BSD)
Page:
Section:
Apropos / Subsearch:
optional field

VARARGS(3)                 Library Functions Manual                 VARARGS(3)



NAME
       varargs - variable argument list

SYNOPSIS
       #include <&lt;varargs.h>&gt;

       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 the argument is expected to  be.   Different
       types  can  be  mixed, but it is up to the routine to know what type of
       argument is expected, since it cannot be determined 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.



                                19 January 1983                     VARARGS(3)