xref: /freebsd/share/man/man3/stdarg.3 (revision dda5b39711dab90ae1c5624bdd6ff7453177df31)
1afe61c15SRodney W. Grimes.\" Copyright (c) 1990, 1991, 1993
2afe61c15SRodney W. Grimes.\"	The Regents of the University of California.  All rights reserved.
3afe61c15SRodney W. Grimes.\"
4afe61c15SRodney W. Grimes.\" This code is derived from software contributed to Berkeley by
5afe61c15SRodney W. Grimes.\" the American National Standards Committee X3, on Information
6afe61c15SRodney W. Grimes.\" Processing Systems.
7afe61c15SRodney W. Grimes.\"
8afe61c15SRodney W. Grimes.\" Redistribution and use in source and binary forms, with or without
9afe61c15SRodney W. Grimes.\" modification, are permitted provided that the following conditions
10afe61c15SRodney W. Grimes.\" are met:
11afe61c15SRodney W. Grimes.\" 1. Redistributions of source code must retain the above copyright
12afe61c15SRodney W. Grimes.\"    notice, this list of conditions and the following disclaimer.
13afe61c15SRodney W. Grimes.\" 2. Redistributions in binary form must reproduce the above copyright
14afe61c15SRodney W. Grimes.\"    notice, this list of conditions and the following disclaimer in the
15afe61c15SRodney W. Grimes.\"    documentation and/or other materials provided with the distribution.
16*dda5b397SEitan Adler.\" 3. Neither the name of the University nor the names of its contributors
17afe61c15SRodney W. Grimes.\"    may be used to endorse or promote products derived from this software
18afe61c15SRodney W. Grimes.\"    without specific prior written permission.
19afe61c15SRodney W. Grimes.\"
20afe61c15SRodney W. Grimes.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
21afe61c15SRodney W. Grimes.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22afe61c15SRodney W. Grimes.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23afe61c15SRodney W. Grimes.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
24afe61c15SRodney W. Grimes.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25afe61c15SRodney W. Grimes.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26afe61c15SRodney W. Grimes.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27afe61c15SRodney W. Grimes.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28afe61c15SRodney W. Grimes.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29afe61c15SRodney W. Grimes.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30afe61c15SRodney W. Grimes.\" SUCH DAMAGE.
31afe61c15SRodney W. Grimes.\"
32afe61c15SRodney W. Grimes.\"	@(#)stdarg.3	8.1 (Berkeley) 6/5/93
337f3dea24SPeter Wemm.\" $FreeBSD$
34afe61c15SRodney W. Grimes.\"
35a40c540fSTim J. Robbins.Dd October 25, 2002
36afe61c15SRodney W. Grimes.Dt STDARG 3
37afe61c15SRodney W. Grimes.Os
38afe61c15SRodney W. Grimes.Sh NAME
39afe61c15SRodney W. Grimes.Nm stdarg
40afe61c15SRodney W. Grimes.Nd variable argument lists
41afe61c15SRodney W. Grimes.Sh SYNOPSIS
4232eef9aeSRuslan Ermilov.In stdarg.h
43afe61c15SRodney W. Grimes.Ft void
44afe61c15SRodney W. Grimes.Fn va_start "va_list ap" last
45afe61c15SRodney W. Grimes.Ft type
46afe61c15SRodney W. Grimes.Fn va_arg "va_list ap" type
47afe61c15SRodney W. Grimes.Ft void
4886954511SMike Barcroft.Fn va_copy "va_list dest" "va_list src"
4986954511SMike Barcroft.Ft void
50afe61c15SRodney W. Grimes.Fn va_end "va_list ap"
51afe61c15SRodney W. Grimes.Sh DESCRIPTION
52afe61c15SRodney W. GrimesA function may be called with a varying number of arguments of varying
53afe61c15SRodney W. Grimestypes.
54afe61c15SRodney W. GrimesThe include file
55fe08efe6SRuslan Ermilov.In stdarg.h
56afe61c15SRodney W. Grimesdeclares a type
57afe61c15SRodney W. Grimes.Pq Em va_list
58484e5bddSJohn Baldwinand defines four macros for stepping
59afe61c15SRodney W. Grimesthrough a list of arguments whose number and types are not known to
60afe61c15SRodney W. Grimesthe called function.
61afe61c15SRodney W. Grimes.Pp
62afe61c15SRodney W. GrimesThe called function must declare an object of type
63afe61c15SRodney W. Grimes.Em va_list
64afe61c15SRodney W. Grimeswhich is used by the macros
65afe61c15SRodney W. Grimes.Fn va_start ,
66afe61c15SRodney W. Grimes.Fn va_arg ,
67a40c540fSTim J. Robbins.Fn va_copy ,
68afe61c15SRodney W. Grimesand
69afe61c15SRodney W. Grimes.Fn va_end .
70afe61c15SRodney W. Grimes.Pp
71afe61c15SRodney W. GrimesThe
72afe61c15SRodney W. Grimes.Fn va_start
73afe61c15SRodney W. Grimesmacro initializes
74afe61c15SRodney W. Grimes.Fa ap
75afe61c15SRodney W. Grimesfor subsequent use by
76484e5bddSJohn Baldwin.Fn va_arg ,
77484e5bddSJohn Baldwin.Fn va_copy ,
78afe61c15SRodney W. Grimesand
79afe61c15SRodney W. Grimes.Fn va_end ,
80afe61c15SRodney W. Grimesand must be called first.
81afe61c15SRodney W. Grimes.Pp
82afe61c15SRodney W. GrimesThe parameter
83afe61c15SRodney W. Grimes.Fa last
84afe61c15SRodney W. Grimesis the name of the last parameter before the variable argument list,
855203edcdSRuslan Ermilovi.e., the last parameter of which the calling function knows the type.
86afe61c15SRodney W. Grimes.Pp
87afe61c15SRodney W. GrimesBecause the address of this parameter is used in the
88afe61c15SRodney W. Grimes.Fn va_start
89afe61c15SRodney W. Grimesmacro, it should not be declared as a register variable, or as a
90afe61c15SRodney W. Grimesfunction or an array type.
91afe61c15SRodney W. Grimes.Pp
92afe61c15SRodney W. GrimesThe
93afe61c15SRodney W. Grimes.Fn va_arg
94afe61c15SRodney W. Grimesmacro expands to an expression that has the type and value of the next
95afe61c15SRodney W. Grimesargument in the call.
96afe61c15SRodney W. GrimesThe parameter
97afe61c15SRodney W. Grimes.Fa ap
98afe61c15SRodney W. Grimesis the
99afe61c15SRodney W. Grimes.Em va_list Fa ap
100afe61c15SRodney W. Grimesinitialized by
101484e5bddSJohn Baldwin.Fn va_start
102484e5bddSJohn Baldwinor
103484e5bddSJohn Baldwin.Fn va_copy .
104afe61c15SRodney W. GrimesEach call to
105afe61c15SRodney W. Grimes.Fn va_arg
106afe61c15SRodney W. Grimesmodifies
107afe61c15SRodney W. Grimes.Fa ap
108afe61c15SRodney W. Grimesso that the next call returns the next argument.
109afe61c15SRodney W. GrimesThe parameter
110afe61c15SRodney W. Grimes.Fa type
111afe61c15SRodney W. Grimesis a type name specified so that the type of a pointer to an
112afe61c15SRodney W. Grimesobject that has the specified type can be obtained simply by
113afe61c15SRodney W. Grimesadding a *
114afe61c15SRodney W. Grimesto
115afe61c15SRodney W. Grimes.Fa type .
116afe61c15SRodney W. Grimes.Pp
117afe61c15SRodney W. GrimesIf there is no next argument, or if
118afe61c15SRodney W. Grimes.Fa type
119afe61c15SRodney W. Grimesis not compatible with the type of the actual next argument
120afe61c15SRodney W. Grimes(as promoted according to the default argument promotions),
121afe61c15SRodney W. Grimesrandom errors will occur.
122afe61c15SRodney W. Grimes.Pp
123afe61c15SRodney W. GrimesThe first use of the
124afe61c15SRodney W. Grimes.Fn va_arg
125afe61c15SRodney W. Grimesmacro after that of the
126afe61c15SRodney W. Grimes.Fn va_start
127afe61c15SRodney W. Grimesmacro returns the argument after
128afe61c15SRodney W. Grimes.Fa last .
129afe61c15SRodney W. GrimesSuccessive invocations return the values of the remaining
130afe61c15SRodney W. Grimesarguments.
131afe61c15SRodney W. Grimes.Pp
132afe61c15SRodney W. GrimesThe
13386954511SMike Barcroft.Fn va_copy
13486954511SMike Barcroftmacro copies a variable argument list, previously initialized by
13586954511SMike Barcroft.Fn va_start ,
13686954511SMike Barcroftfrom
137d962d52aSRuslan Ermilov.Fa src
13886954511SMike Barcroftto
139d962d52aSRuslan Ermilov.Fa dest .
14086954511SMike BarcroftThe state is preserved such that it is equivalent to calling
14186954511SMike Barcroft.Fn va_start
14286954511SMike Barcroftwith the same second argument used with
143d962d52aSRuslan Ermilov.Fa src ,
14486954511SMike Barcroftand calling
14586954511SMike Barcroft.Fn va_arg
14686954511SMike Barcroftthe same number of times as called with
147d962d52aSRuslan Ermilov.Fa src .
14886954511SMike Barcroft.Pp
14986954511SMike BarcroftThe
150484e5bddSJohn Baldwin.Fn va_end
151484e5bddSJohn Baldwinmacro cleans up any state associated with the variable argument list
152484e5bddSJohn Baldwin.Fa ap .
153484e5bddSJohn Baldwin.Pp
154484e5bddSJohn BaldwinEach invocation of
155484e5bddSJohn Baldwin.Fn va_start
156484e5bddSJohn Baldwinor
15786954511SMike Barcroft.Fn va_copy
158484e5bddSJohn Baldwinmust be paired with a corresponding invocation of
159484e5bddSJohn Baldwin.Fn va_end
160484e5bddSJohn Baldwinin the same function.
161484e5bddSJohn Baldwin.Sh RETURN VALUES
162484e5bddSJohn BaldwinThe
163484e5bddSJohn Baldwin.Fn va_arg
164484e5bddSJohn Baldwinmacro returns the value of the next argument.
16586954511SMike Barcroft.Pp
16686954511SMike BarcroftThe
167484e5bddSJohn Baldwin.Fn va_start ,
168484e5bddSJohn Baldwin.Fn va_copy ,
169484e5bddSJohn Baldwinand
170afe61c15SRodney W. Grimes.Fn va_end
171484e5bddSJohn Baldwinmacros return no value.
172afe61c15SRodney W. Grimes.Sh EXAMPLES
173afe61c15SRodney W. GrimesThe function
174afe61c15SRodney W. Grimes.Em foo
175afe61c15SRodney W. Grimestakes a string of format characters and prints out the argument
176afe61c15SRodney W. Grimesassociated with each format character based on the type.
177afe61c15SRodney W. Grimes.Bd -literal -offset indent
178afe61c15SRodney W. Grimesvoid foo(char *fmt, ...)
179afe61c15SRodney W. Grimes{
180afe61c15SRodney W. Grimes	va_list ap;
181afe61c15SRodney W. Grimes	int d;
182cc023582SDima Dorfman	char c, *s;
183afe61c15SRodney W. Grimes
184afe61c15SRodney W. Grimes	va_start(ap, fmt);
185afe61c15SRodney W. Grimes	while (*fmt)
186afe61c15SRodney W. Grimes		switch(*fmt++) {
187afe61c15SRodney W. Grimes		case 's':			/* string */
188afe61c15SRodney W. Grimes			s = va_arg(ap, char *);
189afe61c15SRodney W. Grimes			printf("string %s\en", s);
190afe61c15SRodney W. Grimes			break;
191afe61c15SRodney W. Grimes		case 'd':			/* int */
192afe61c15SRodney W. Grimes			d = va_arg(ap, int);
193afe61c15SRodney W. Grimes			printf("int %d\en", d);
194afe61c15SRodney W. Grimes			break;
195afe61c15SRodney W. Grimes		case 'c':			/* char */
19604bbb62bSJoshua Peck Macdonald			/* Note: char is promoted to int. */
19704bbb62bSJoshua Peck Macdonald			c = va_arg(ap, int);
198afe61c15SRodney W. Grimes			printf("char %c\en", c);
199afe61c15SRodney W. Grimes			break;
200afe61c15SRodney W. Grimes		}
201afe61c15SRodney W. Grimes	va_end(ap);
202afe61c15SRodney W. Grimes}
203afe61c15SRodney W. Grimes.Ed
2049cbda590SRuslan Ermilov.Sh COMPATIBILITY
2059cbda590SRuslan ErmilovThese macros are
2069cbda590SRuslan Ermilov.Em not
2079cbda590SRuslan Ermilovcompatible with the historic macros they replace.
2089cbda590SRuslan ErmilovA backward compatible version can be found in the include
2099cbda590SRuslan Ermilovfile
2109cbda590SRuslan Ermilov.In varargs.h .
211afe61c15SRodney W. Grimes.Sh STANDARDS
212afe61c15SRodney W. GrimesThe
213afe61c15SRodney W. Grimes.Fn va_start ,
214afe61c15SRodney W. Grimes.Fn va_arg ,
215a40c540fSTim J. Robbins.Fn va_copy ,
216afe61c15SRodney W. Grimesand
217afe61c15SRodney W. Grimes.Fn va_end
218afe61c15SRodney W. Grimesmacros conform to
219a40c540fSTim J. Robbins.St -isoC-99 .
220afe61c15SRodney W. Grimes.Sh BUGS
221afe61c15SRodney W. GrimesUnlike the
222afe61c15SRodney W. Grimes.Em varargs
223afe61c15SRodney W. Grimesmacros, the
2244b66483fSRuslan Ermilov.Nm
225afe61c15SRodney W. Grimesmacros do not permit programmers to
226afe61c15SRodney W. Grimescode a function with no fixed arguments.
227afe61c15SRodney W. GrimesThis problem generates work mainly when converting
228afe61c15SRodney W. Grimes.Em varargs
229afe61c15SRodney W. Grimescode to
2304b66483fSRuslan Ermilov.Nm
231afe61c15SRodney W. Grimescode,
232afe61c15SRodney W. Grimesbut it also creates difficulties for variadic functions that
233afe61c15SRodney W. Grimeswish to pass all of their arguments on to a function
234afe61c15SRodney W. Grimesthat takes a
235afe61c15SRodney W. Grimes.Em va_list
236afe61c15SRodney W. Grimesargument, such as
237afe61c15SRodney W. Grimes.Xr vfprintf 3 .
238