.\" -*- coding: UTF-8 -*- .\" 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. .\" .\" %%%LICENSE_START(BSD_4_CLAUSE_UCB) .\" 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. .\" %%%LICENSE_END .\" .\" @(#)stdarg.3 6.8 (Berkeley) 6/29/91 .\" .\" Converted for Linux, Mon Nov 29 15:11:11 1993, faith@cs.unc.edu .\" Additions, 2001-10-14, aeb .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH STDARG 3 "15. September 2017" "" Linux\-Programmierhandbuch .SH BEZEICHNUNG stdarg, va_start, va_arg, va_end, va_copy \- variable Argument\-Listen .SH ÜBERSICHT \fB#include \fP .PP \fBvoid va_start( va_list \fP\fIap\fP\fB, \fP\fIletztes\fP\fB);\fP .br \fItype\fP\fB va_arg( va_list \fP\fIap\fP\fB, \fP\fItyp\fP\fB);\fP .br \fBvoid va_end(va_list \fP\fIap\fP\fB);\fP .br \fBvoid va_copy(va_list \fP\fIziel\fP\fB, va_list \fP\fIquelle\fP\fB);\fP .SH BESCHREIBUNG Eine Funktion kann mit einer unterschiedlichen Anzahl von Argumenten verschiedenen Typs aufgerufen werden. Die Include\-Datei \fIstdarg.h\fP deklariert einen Typ \fBva_list\fP und definiert drei Makros, um eine Liste von Argumenten durchzugehen, deren Anzahl und Typen der aufgerufenen Funktion unbekannt sind. .PP Die aufgerufene Funktion muss ein Objekt des Typs \fBva_list\fP deklarieren, welches von den Makros \fBva_start\fP(), \fBva_arg\fP() und \fBva_end\fP() benutzt wird. .SS va_start() Das Makro \fBva_start\fP() initialisiert \fIap\fP zur nachfolgenden Benutzung durch \fBva_arg\fP() und \fBva_end\fP() und muss zuerst aufgerufen werden. .PP Das Argument \fIletztes\fP ist der Name des letzten Arguments vor der Liste der veränderlichen Argumente, das heisst, das letzt Argument, dessen Typ die aufrufende Funktion kennt. .PP Da die Adresse dieses Parameters im Makro \fBva_start\fP() benutzt wird, sollte er nicht als eine Registervariable, als Funktion oder als ein Feldtyp deklariert werden. .SS va_arg() Das Makro \fBva_arg\fP() expandiert zu einem Ausdruck, der den Typ und Wert des nächsten aufzurufenden Argumentes hat. Das Argument \fIap\fP ist die \fBva_list\fP \fIap\fP, initialisiert durch \fBva_start\fP(). Jeder Aufruf von \fBva_arg\fP() verändert \fIap\fP so, dass der folgende Aufruf das nächste Argument zurückgibt. Der Parameter \fItyp\fP ist ein Typenname, der so angegeben ist, dass der Typ eines Zeigers auf ein Objekt, das den angegebenen Typ hat, einfach durch Hinzufügen eines * zu \fItyp\fP erhalten werden kann. .PP Die erste Benutzung des Makros \fBva_arg\fP() nach \fBva_start\fP() gibt das Argument nach \fIletztes\fP zurück. Nachfolgende Aufrufe geben die Werte der verbleibenden Argumente zurück. .PP Wenn es kein weiteres Argument gibt oder wenn \fItyp\fP nicht kompatibel mit dem Typ des tatsächlich nächsten Argumentes ist (entsprechend der üblichen »argument promotions«), erscheinen zufällige Fehler. .PP Falls \fIap\fP an eine Funktion übergeben wird, die \fBva_arg(\fP\fIap\fP\fB,\fP\fItype\fP\fB)\fP benutzt, dann ist der Wert von \fIap\fP nach der Rückkehr dieser Funktion undefiniert. .SS va_end() Zu jedem Aufruf von \fBva_start\fP() muss zu einen zugehörigen Aufruf von \fBva_end\fP() in der gleichen Funktion geben. Nach dem Aufruf \fBva_end(\fP\fIap\fP\fB)\fP ist die Variable \fIap\fP undefiniert. Es sind mehrere Durchläufe der Liste möglich, jeweils von \fBva_start\fP() und \fBva_end\fP() eingeschlossen. \fBva_end\fP() kann ein Makro oder eine Funktion sein. .SS va_copy() Das Makro \fBva_copy\fP() kopiert die (vorher initialisierte) Variablenargumentliste \fIquelle\fP nach \fIziel\fP. Das Verhalten ist so, als ob \fBva_start\fP() auf \fIziel\fP mit dem selben Argument \fIletztes\fP angewandt worden wäre, gefolgt von der gleichen Anzahl Aufrufe von \fBva_arg\fP(), die benutzt wurden, um den aktuellen Status von \fIquelle\fP zu erreichen. .PP .\" Proposal from clive@demon.net, 1997-02-28 Eine naheliegende Implementierung hätte eine \fIva_list\fP, die ein Zeiger in den »Stack\-Frame« der variadischen Funktion wäre. In einem derartigen Szenario (dem bei weitem üblichsten) scheint nichts gegen folgende Zuweisung zu sprechen .PP .in +4n .EX va_list aq = ap; .EE .in .PP Leider gibt es auch Systeme, die es als Feld von Zeigern (der Länge 1) anlegen. Dort wird dann folgendes benötigt: .PP .in +4n .EX va_list aq; *aq = *ap; .EE .in .PP Zu guter Letzt kann es auf Systemen, die Argumente in Registern übergeben, nötig sein, dass \fBva_start\fP Speicher reserviert und in diesem die Argumente und einen Positionsanzeiger speichert, so dass \fBva_arg\fP() diese Liste durchschreiten kann. Dann kann \fBva_end\fP() den reservierten Speicher wieder freigeben. Um dieser Situation Rechnung zu tragen, fügt C99 ein Makro \fBva_copy\fP() hinzu, so dass obige Zuweisung durch Folgendes ersetzt werden kann .PP .in +4n .EX va_list aq; va_copy(aq, ap); … va_end(aq); .EE .in .PP Zu jedem Aufruf von \fBva_copy\fP() muss zu einen zugehörigen Aufruf von \fBva_end\fP() in der gleichen Funktion geben. Einige Systeme, die kein \fBva_copy\fP() bereitstellen, haben stattdessen \fB__va_copy\fP, da das der gleiche Name ist, der im ursprünglichen Vorschlag benutzt wurde. .SH ATTRIBUTE Siehe \fBattributes\fP(7) für eine Erläuterung der in diesem Abschnitt verwandten Ausdrücke. .TS allbox; lbw21 lb lb l l l. Schnittstelle Attribut Wert T{ \fBva_start\fP(), \fBva_end\fP(), \fBva_copy\fP() T} Multithread\-Fähigkeit MT\-Safe T{ \fBva_arg\fP() T} Multithread\-Fähigkeit MT\-Safe race:ap .TE .SH "KONFORM ZU" Die Makros \fBva_start\fP(), \fBva_arg\fP() und \fBva_end\fP() sind konform zu C89. C99 definiert das Makro \fBva_copy\fP(). .SH ANMERKUNGEN Diese Makros sind \fInicht\fP kompatibel mit den historischen Makros, die sie ersetzen. Eine abwärtskompatible Version kann in der Include\-Datei \fI\fP gefunden werden. .PP Die historische Einstellung ist: .PP .in +4n .EX #include void foo(va_alist) va_dcl { va_list ap; va_start(ap); while (…) { … x = va_arg(ap, type); … } va_end(ap); } .EE .in .PP Auf einigen Systemen enthält \fIva_end\fP eine abschließende »}«, die zu einer »{« in \fIva_start\fP passt, so dass beide Makros in der gleichen Funktion auf eine Weise erscheinen müssen, die dies möglicht. .SH FEHLER Im Gegensatz zu den Makros \fBvarargs\fP erlauben die Makros \fBstdarg\fP dem Programmierer nicht, eine Funktion ohne feste Argumente zu implementieren. Das ist hauptsächlich ein Problem, wenn man Code mit \fBvarargs\fP nach \fBstdarg\fP konvertiert, aber es erzeugt auch Schwierigkeiten bei veränderlichen Funktionen die wünschen, ihre Argumente an eine Funktion weiterzugeben, die ein Argument \fBva_list\fP aufnimmt, so wie \fBvfprintf\fP(3). .SH BEISPIEL Die Funktion \fIfoo\fP nimmt eine Zeichenkette von Formatzeichen entgegen und gibt für jedes Zeichen ein Argument des entsprechenden Typs aus. .PP .EX #include #include void foo(char *fmt, …) { va_list ap; int d; char c, *s; va_start(ap, fmt); while (*fmt) switch (*fmt++) { case \(aqs\(aq: /* Zeichenkette */ s = va_arg(ap, char *); printf("string %s\en", s); break; case \(aqd\(aq: /* Ganzzahl */ d = va_arg(ap, int); printf("int %d\en", d); break; case \(aqc\(aq: /* Zeichen */ /* hier wird eine Typumwandlung benötigt, da va_arg nur vollständig unterstützte Typen aufnimmt */ c = (char) va_arg(ap, int); printf("Zeichen %c\en", c); break; } va_end(ap); } .EE .SH KOLOPHON Diese Seite ist Teil der Veröffentlichung 4.16 des Projekts Linux\-\fIman\-pages\fP. Eine Beschreibung des Projekts, Informationen, wie Fehler gemeldet werden können sowie die aktuelle Version dieser Seite finden sich unter \%https://www.kernel.org/doc/man\-pages/. .SH ÜBERSETZUNG Die deutsche Übersetzung dieser Handbuchseite wurde von Patrick Rother und Chris Leick erstellt. Diese Übersetzung ist Freie Dokumentation; lesen Sie die GNU General Public License Version 3 oder neuer bezüglich der Copyright-Bedingungen. Es wird KEINE HAFTUNG übernommen. Wenn Sie Fehler in der Übersetzung dieser Handbuchseite finden, schicken Sie bitte eine E-Mail an .