.\" -*- 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 "9 maja 2019 r." "" "Podręcznik programisty Linuksa" .SH NAZWA stdarg, va_start, va_arg, va_end, va_copy \- listy zmiennych argumentów .SH SKŁADNIA \fB#include \fP .PP \fBvoid va_start(va_list \fP\fIap\fP\fB, \fP\fIlast\fP\fB);\fP .br \fItype\fP\fB va_arg(va_list \fP\fIap\fP\fB, \fP\fItype\fP\fB);\fP .br \fBvoid va_end(va_list \fP\fIap\fP\fB);\fP .br \fBvoid va_copy(va_list \fP\fIdest\fP\fB, va_list \fP\fIsrc\fP\fB);\fP .SH OPIS Funkcję można wołać z różną liczbą argumentów różnych typów. Plik nagłówkowy \fI\fP deklaruje typ \fIva_list\fP i definiuje trzy makra, iterujące przez listę argumentów, których liczba i typy nie są znane wywołanej funkcji. .PP Wywołana funkcja musi zadeklarować obiekt typu \fIva_list\fP, który jest używany przez makra \fBva_start\fP(), \fBva_arg\fP() i \fBva_end\fP(). .SS va_start() Makro \fBva_start\fP() inicjuje \fIap\fP do dalszego użytku przez \fBva_arg\fP() i \fBva_end\fP() i musi być wywołane pierwsze. .PP Parametr \fIlast\fP jest nazwą ostatniego argumentu przed zmienną listą argumentów, czyli ostatnim argumentem, którego typ jest funkcji znany. .PP Ponieważ adres tego parametru jest używany w makrze \fBva_start\fP(), nie powinien być deklarowany jako zmienna rejestrowa, funkcja czy typ tablicowy. .SS va_arg() Makro \fBva_arg\fP() rozwija się do wyrażenia, które ma typ i wartość następnego argumentu w wywołaniu. Argument \fIap\fP to \fIap\fP z \fBva_list\fP() zainicjowany przez \fBva_start\fP(). Każde wywołanie \fBva_arg\fP() zmienia \fIap\fP tak, że następne wywołanie zwraca następny argument. Argument \fItype\fP jest nazwą typu, podaną tak że typ wskaźnika do obiektu, który ma podany typ, można uzyskać przez dodanie * do \fItype\fP. .PP Pierwsze użycie makra \fBva_arg\fP() po \fBva_start\fP() zwraca argument za \fIlast\fP (ostatnim). Kolejne wywołania zwracają wartości pozostałych argumentów. .PP Jeśli nie ma następnego argumentu lub jeśli \fItype\fP nie jest zgodny z rzeczywistym typem następnego argumentu, pojawią się losowe błędy. .PP Jeśli \fIap\fP zostanie przekazane do funkcji używającej \fBva_arg(\fP\fIap\fP\fB,\fP\fItype\fP\fB),\fP to wartość \fIap\fP po zakończeniu tej funkcji będzie nieokreślona. .SS va_end() Każdemu wywołaniu \fBva_start\fP() musi odpowiadać wywołanie \fBva_end\fP() w obrębie tej samej funkcji. Po wywołaniu \fBva_end\fP() wartość \fIap\fP będzie nieokreślona. Lista może być przetwarzana wielokrotnie, przy czym każde przetworzenie musi być zawarte pomiędzy \fBva_start\fP() a \fBva_end\fP(). \fBva_end\fP() może być zarówno makrem, jak i funkcją. .SS va_copy() Makro \fBva_copy\fP() kopiuje (poprzednio zainicjowaną) listę\ \fIsrc\fP argumentów o zmiennej długości do \fIdest\fP. Zachowanie to jest takie samo, jakby \fBva_start\fP() zostało zaaplikowane do \fIdest\fP z tym samym argumentem \fIlast\fP, po którym następowałaby ta sama liczba wywołań \fBva_arg\fP(), która była użyta do tej pory, aby osiągnąć bieżący stan zmiennej \fIsrc\fP. .PP .\" Proposal from clive@demon.net, 1997-02-28 Oczywista implementacja zawierałaby wskaźnik \fIva_list\fP do ramki stosu funkcji o zmiennej liczbie argumentów. Przy takiej konfiguracji (jak dotąd, najpowszechniejszej) nie ma żadnych przeciwwskazań do podstawienia .PP .in +4n .EX va_list aq = ap; .EE .in .PP Niestety, są również systemy, które robią to poprzez tablicę wskaźników (o długości 1) i wtedy niezbędne jest .PP .in +4n .EX va_list aq; *aq = *ap; .EE .in .PP Wreszcie, w systemach, które przekazują parametry w rejestrach, może okazać się konieczne przydzielenie pamięci przez \fBva_start\fP(), przechowanie tam argumentów, jak też wskazań, który argument jest następny, tak aby \fBva_arg\fP() mogło przejść całą listę. Wówczas \fBva_end\fP() może wreszcie zwolnić przydzieloną w tym celu pamięć. Aby dostosować się do tej sytuacji, C99 dodaje makro \fBva_copy\fP(), tak aby powyższe przypisanie mogło być zastąpione przez .PP .in +4n .EX va_list aq; va_copy(aq, ap); \&... va_end(aq); .EE .in .PP Każdemu wywołaniu \fBva_copy\fP() musi odpowiadać wywołanie \fBva_end\fP() w obrębie tej samej funkcji. Niektóre systemy nieudostępniające \fBva_copy\fP() mają zamiast niej \fB__va_copy\fP, gdyż ta nazwa była używana w szkicu standardu. .SH ATRYBUTY Informacje o pojęciach używanych w tym rozdziale można znaleźć w podręczniku \fBattributes\fP(7). .TS allbox; lbw21 lb lb l l l. Interfejs Atrybut Wartość T{ \fBva_start\fP(), \fBva_end\fP(), \fBva_copy\fP() T} Bezpieczeństwo wątkowe MT\-Safe T{ \fBva_arg\fP() T} Bezpieczeństwo wątkowe MT\-Safe race:ap .TE .SH "ZGODNE Z" Makra \fBva_start\fP(), \fBva_arg\fP() oraz \fBva_end\fP() są zgodne z C89. C99 opisuje makro \fBva_copy\fP(). .SH BŁĘDY W przeciwieństwie do makr \fBvarargs\fP, makra \fBstdarg\fP nie zezwalają programistom na tworzenie funkcji bez ustalonych argumentów. Problem ten powoduje utrudnienia podczas konwersji kodu \fBvarargs\fP na kod \fBstdarg\fP, a także utrudnia tworzenie funkcji, które mają za zadanie jedynie przekazać wszystkie swoje argumenty do funkcji pobierającej argument \fIva_list\fP, takiej jak \fBvfprintf\fP(3). .SH PRZYKŁAD Funkcja \fIfoo\fP pobiera łańcuch znaków formatujących i wypisuje argumenty z nimi związane w oparciu o typ argumentu. .PP .EX #include #include void foo(char *fmt, ...) /* '...' jest składnią języka C dla funkcji o zmiennej liczbie argumentów */ { va_list ap; int d; char c, *s; va_start(ap, fmt); while (*fmt) switch (*fmt++) { case \(aqs\(aq: /* string */ s = va_arg(ap, char *); printf("string %s\en", s); break; case \(aqd\(aq: /* int */ d = va_arg(ap, int); printf("int %d\en", d); break; case \(aqc\(aq: /* char */ /* występuje tu potrzeba rzutowania, gdyż va_arg pobiera w pełni awansowane typy */ c = (char) va_arg(ap, int); printf("char %c\en", c); break; } va_end(ap); } .EE .SH "O STRONIE" Angielska wersja tej strony pochodzi z wydania 5.04 projektu Linux \fIman\-pages\fP. Opis projektu, informacje dotyczące zgłaszania błędów oraz najnowszą wersję oryginału można znaleźć pod adresem \%https://www.kernel.org/doc/man\-pages/. .SH TŁUMACZENIE Autorami polskiego tłumaczenia niniejszej strony podręcznika są: Przemek Borys , Andrzej Krzysztofowicz , Robert Luberda i Michał Kułach . Niniejsze tłumaczenie jest wolną dokumentacją. Bliższe informacje o warunkach licencji można uzyskać zapoznając się z .UR https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License w wersji 3 .UE lub nowszej. Nie przyjmuje się ŻADNEJ ODPOWIEDZIALNOŚCI. Błędy w tłumaczeniu strony podręcznika prosimy zgłaszać na adres .MT manpages-pl-list@lists.sourceforge.net .ME .