.\" Copyright (c) 1990, 1991 The Regents of the University of California. .\" All rights reserved. .\" .\" This code is derived from software contributed to Berkeley by .\" the American National Standards Committee X3, on Information .\" Processing Systems. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions .\" are met: .\" 1. Redistributions of source code must retain the above copyright .\" notice, this list of conditions and the following disclaimer. .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. .\" 3. All advertising materials mentioning features or use of this software .\" must display the following acknowledgement: .\" This product includes software developed by the University of .\" California, Berkeley and its contributors. .\" 4. Neither the name of the University nor the names of its contributors .\" may be used to endorse or promote products derived from this software .\" without specific prior written permission. .\" .\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE .\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE .\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" .\" @(#)stdarg.3 6.8 (Berkeley) 6/29/91 .\" .\" Converted for Linux, Mon Nov 29 15:11:11 1993, faith@cs.unc.edu .\" Translated to German Sun Jun 23 17:00:00 1996 by Patrick Rother .\" .TH STDARG 3 "23. Juni 1996" "BSD" "Bibliotheksfunktionen" .SH BEZEICHNUNG stdarg \- variable Argument-Listen .SH ÜBERSICHT .B #include .sp .BI "void va_start( va_list " ap ", " last ); .br .BI "" type " va_arg( va_list " ap ", " type ); .br .BI "void va_end( va_list " ap ); .SH BESCHREIBUNG Eine Funktion darf mit einer veränderlchen Anzahl von Argumenten veränderlichen Typs aufgerufen werden. Die Include-Datei .I stdarg.h deklariert einen Typ .B va_list und definiert drei Makros, um eine Liste vor Argumenten durchzugehen, deren Anzahl und Typen der aufgerufenen Funktion unbekannt sind. .PP Die aufgerufene Funktion muss ein Objekt des Typs .B va_list deklarieren, welches von den Makros .BR va_start , .BR va_arg , und .BR va_end benutzt wird. .PP Das Makro .B va_start initialisiert .I ap für spätere Benutzung durch .B va_arg und .BR va_end , und muss zuerst aufgerufen werden. .PP Der Parameter .I last ist der Name des letzten Parameters vor der Liste der veränderlichen Argumente, d.h. der letzte Parameter, dessen Typ die aufrufende Funktion kennt. .PP Da die Adresse dieses Parameters in dem Makro .B va_start benutzt wird sollte er nicht als eine Registervariable, als Funktion oder Array-Typ deklariert sein. .PP Das Makro .B va_start liefert keinen Wert zurück. .PP Das Makro .B va_arg expandiert zu einem Ausdruck, der den Typ und Wert des nächsten aufzurufenden Argumentes hat. Der Parameter .I ap ist .BI va_list " " ap initialisiert durch .BR va_start . Jeder Aufruf von .B va_arg verändert .I ap so dass der nächste Aufruf das nächste Argument zurückliefert. Der Parameter .I type ist ein Typenname, der so angegeben ist, dass der Typ eines Pointers auf ein Objekt, das den angegebenen Typ hat, durch Hinzufügen eines * zu .IR type erhalten werden kann. .PP Wenn es kein weiteres Argument gibt, oder wenn .I type nicht kompatibel mit dem Typ des nächsten Argumentes ist, erscheinen zufällige Fehler. .PP Die erste Benutzung des Makros .B va_arg nach .B va_start liefert das Argument nach .IR last zurück. Folgende Aufrufe geben die Werte der verbleibenden Argumente zurück. .PP Das Makro .B va_end ermöglicht eine normale Rückkehr aus der Funktion dessen variable Argumentliste durch .BR va_start initialisiert wurde. .PP Das Makro .B va_end liefert keinen Wert zurück. .SH BEISPIELE Die Funktion .I foo nimmt einem String von Format-Zeichen und gibt das Argument aus, das mit jedem Format-Zeichen in Zusammenhang gebracht wird, basierend auf dem Typ. .RS .nf void foo(char *fmt, ...) { va_list ap; int d; char c, *p, *s; va_start(ap, fmt); while (*fmt) switch(*fmt++) { case 's': /* string */ s = va_arg(ap, char *); printf("string %s\en", s); break; case 'd': /* int */ d = va_arg(ap, int); printf("int %d\en", d); break; case 'c': /* char */ c = va_arg(ap, char); printf("char %c\en", c); break; } va_end(ap); } .fi .RE .SH STANDARDS Die Makros .BR va_start , .BR va_arg , und .B va_end sind konform zu ANSI C3.159-1989 (``ANSI C''). .SH KOMPATIBILITÄT Diese Makros sind .I not kompatibel mit den historischen Makros, die sie ersetzen. Eine abwärtskompatible Version kann in der Includedatei .IR varargs.h gefunden werden. .SH BUGS Im Gegensatz zu den Makros .B varargs erlauben die Makros .B stdarg dem Programmierer nicht, eine Funktion ohne feste Argumente zu implementieren. Dieses Problem macht hauptsächlich Arbeit wenn man Code mit .B varargs nach .B stdarg konvertiert, aber es erzeugt auch Schwierigkeiten bei veränderlichen Funktionen die wünschen, ihre Argumente an eine Funktion weiterzugeben, die ein Argument .B va_list nimmt, wie .BR vfprintf (3).