blob: 48110316878773e7003a022620c098d46d099845 [file] [log] [blame]
<html lang="en">
<head>
<title>Receiving Arguments - The GNU C Library</title>
<meta http-equiv="Content-Type" content="text/html">
<meta name="description" content="The GNU C Library">
<meta name="generator" content="makeinfo 4.13">
<link title="Top" rel="start" href="index.html#Top">
<link rel="up" href="How-Variadic.html#How-Variadic" title="How Variadic">
<link rel="prev" href="Variadic-Prototypes.html#Variadic-Prototypes" title="Variadic Prototypes">
<link rel="next" href="How-Many-Arguments.html#How-Many-Arguments" title="How Many Arguments">
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
<!--
This file documents the GNU C library.
This is Edition 0.12, last updated 2007-10-27,
of `The GNU C Library Reference Manual', for version
2.8 (Sourcery G++ Lite 2011.03-41).
Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002,
2003, 2007, 2008, 2010 Free Software Foundation, Inc.
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.3 or
any later version published by the Free Software Foundation; with the
Invariant Sections being ``Free Software Needs Free Documentation''
and ``GNU Lesser General Public License'', the Front-Cover texts being
``A GNU Manual'', and with the Back-Cover Texts as in (a) below. A
copy of the license is included in the section entitled "GNU Free
Documentation License".
(a) The FSF's Back-Cover Text is: ``You have the freedom to
copy and modify this GNU manual. Buying copies from the FSF
supports it in developing GNU and promoting software freedom.''-->
<meta http-equiv="Content-Style-Type" content="text/css">
<style type="text/css"><!--
pre.display { font-family:inherit }
pre.format { font-family:inherit }
pre.smalldisplay { font-family:inherit; font-size:smaller }
pre.smallformat { font-family:inherit; font-size:smaller }
pre.smallexample { font-size:smaller }
pre.smalllisp { font-size:smaller }
span.sc { font-variant:small-caps }
span.roman { font-family:serif; font-weight:normal; }
span.sansserif { font-family:sans-serif; font-weight:normal; }
--></style>
<link rel="stylesheet" type="text/css" href="../cs.css">
</head>
<body>
<div class="node">
<a name="Receiving-Arguments"></a>
<p>
Next:&nbsp;<a rel="next" accesskey="n" href="How-Many-Arguments.html#How-Many-Arguments">How Many Arguments</a>,
Previous:&nbsp;<a rel="previous" accesskey="p" href="Variadic-Prototypes.html#Variadic-Prototypes">Variadic Prototypes</a>,
Up:&nbsp;<a rel="up" accesskey="u" href="How-Variadic.html#How-Variadic">How Variadic</a>
<hr>
</div>
<h5 class="subsubsection">A.2.2.2 Receiving the Argument Values</h5>
<p><a name="index-variadic-function-argument-access-3715"></a><a name="index-arguments-_0028variadic-functions_0029-3716"></a>
Ordinary fixed arguments have individual names, and you can use these
names to access their values. But optional arguments have no
names&mdash;nothing but &lsquo;<samp><span class="samp">...</span></samp>&rsquo;. How can you access them?
<p><a name="index-stdarg_002eh-3717"></a>The only way to access them is sequentially, in the order they were
written, and you must use special macros from <samp><span class="file">stdarg.h</span></samp> in the
following three step process:
<ol type=1 start=1>
<li>You initialize an argument pointer variable of type <code>va_list</code> using
<code>va_start</code>. The argument pointer when initialized points to the
first optional argument.
<li>You access the optional arguments by successive calls to <code>va_arg</code>.
The first call to <code>va_arg</code> gives you the first optional argument,
the next call gives you the second, and so on.
<p>You can stop at any time if you wish to ignore any remaining optional
arguments. It is perfectly all right for a function to access fewer
arguments than were supplied in the call, but you will get garbage
values if you try to access too many arguments.
<li>You indicate that you are finished with the argument pointer variable by
calling <code>va_end</code>.
<p>(In practice, with most C compilers, calling <code>va_end</code> does nothing.
This is always true in the GNU C compiler. But you might as well call
<code>va_end</code> just in case your program is someday compiled with a peculiar
compiler.)
</ol>
<p>See <a href="Argument-Macros.html#Argument-Macros">Argument Macros</a>, for the full definitions of <code>va_start</code>,
<code>va_arg</code> and <code>va_end</code>.
<p>Steps 1 and 3 must be performed in the function that accepts the
optional arguments. However, you can pass the <code>va_list</code> variable
as an argument to another function and perform all or part of step 2
there.
<p>You can perform the entire sequence of three steps multiple times
within a single function invocation. If you want to ignore the optional
arguments, you can do these steps zero times.
<p>You can have more than one argument pointer variable if you like. You
can initialize each variable with <code>va_start</code> when you wish, and
then you can fetch arguments with each argument pointer as you wish.
Each argument pointer variable will sequence through the same set of
argument values, but at its own pace.
<p><strong>Portability note:</strong> With some compilers, once you pass an
argument pointer value to a subroutine, you must not keep using the same
argument pointer value after that subroutine returns. For full
portability, you should just pass it to <code>va_end</code>. This is actually
an ISO&nbsp;C<!-- /@w --> requirement, but most ANSI C compilers work happily
regardless.
</body></html>