.\" -*- coding: UTF-8 -*- '\" t .\" Copyright 1990-1991, The Regents of the University of California. .\" Copyright, the authors of the Linux man-pages project .\" .\" SPDX-License-Identifier: BSD-4-Clause-UC .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH stdarg 3 "17 maja 2025 r." "Linux man\-pages 6.18" .SH NAZWA stdarg, va_start, va_arg, va_end, va_copy \- listy zmiennych argumentów .SH BIBLIOTEKA Standardowa biblioteka C (\fIlibc\fP,\ \fI\-lc\fP) .SH SKŁADNIA .nf \fB#include \fP .P \fBvoid va_start(va_list \fP\fIap\fP\fB, \fP\fIlast\fP\fB);\fP \fItype\fP\fB va_arg(va_list \fP\fIap\fP\fB, \fP\fItype\fP\fB);\fP \fBvoid va_end(va_list \fP\fIap\fP\fB);\fP \fBvoid va_copy(va_list \fP\fIdest\fP\fB, va_list \fP\fIsrc\fP\fB);\fP .fi .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. .P 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. .P Parametr \fIlast\fP jest nazwą ostatniego argumentu przed zmienną listą argumentów, czyli ostatnim argumentem, którego typ jest funkcji znany. .P 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. .P 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. .P 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. .P 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. .P .\" 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 .P .in +4n .EX va_list aq = ap; .EE .in .P Niestety, są również systemy, które robią to poprzez tablicę wskaźników (o długości 1) i wtedy niezbędne jest .P .in +4n .EX va_list aq; *aq = *ap; .EE .in .P 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 .P .in +4n .EX va_list aq; va_copy(aq, ap); \&... va_end(aq); .EE .in .P 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; lbx lb lb l l l. Interfejs Atrybut Wartość T{ .na .nh \fBva_start\fP(), \fBva_end\fP(), \fBva_copy\fP() T} Bezpieczeństwo wątkowe MT\-bezpieczne T{ .na .nh \fBva_arg\fP() T} Bezpieczeństwo wątkowe MT\-bezpieczne race:ap .TE .SH STANDARDY C11, POSIX.1\-2008. .SH HISTORIA .TP \fBva_start\fP() .TQ \fBva_arg\fP() .TQ \fBva_end\fP() C89, POSIX.1\-2001. .TP \fBva_copy\fP() C99, POSIX.1\-2001. .SH ZASTRZEŻENIA 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ŁADY Funkcja \fIfoo\fP pobiera łańcuch znaków formatujących i wypisuje argumenty z nimi związane w oparciu o typ argumentu. .P .EX #include #include \& void foo(char *fmt, ...) /* \[aq]...\[aq] jest składnią języka C dla funkcji o zmiennej liczbie argumentów */ \& { va_list ap; int d; char c; char *s; \& va_start(ap, fmt); while (*fmt) switch (*fmt++) { case \[aq]s\[aq]: /* łańcuch */ s = va_arg(ap, char *); printf("łańcuch %s\[rs]n", s); break; case \[aq]d\[aq]: /* liczba całkowita*/ d = va_arg(ap, int); printf("liczba całkowita %d\[rs]n", d); break; case \[aq]c\[aq]: /* znak */ /* występuje tu potrzeba rzutowania, gdyż va_arg pobiera w pełni awansowane typy */ c = (char) va_arg(ap, int); printf("znak %c\[rs]n", c); break; } va_end(ap); } .EE .SH "ZOBACZ TAKŻE" \fBvprintf\fP(3), \fBvscanf\fP(3), \fBvsyslog\fP(3) .PP .SH TŁUMACZENIE Tłumaczenie niniejszej strony podręcznika: Przemek Borys , Andrzej Krzysztofowicz , Robert Luberda i Michał Kułach . .PP 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. .PP Błędy w tłumaczeniu strony podręcznika prosimy zgłaszać na adres listy dyskusyjnej .MT manpages-pl-list@lists.sourceforge.net .ME .