.\" -*- coding: UTF-8 -*- '\" t .\" 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. .\" .\" SPDX-License-Identifier: BSD-4-Clause-UC .\" .\" @(#)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 "20 lipca 2023 r." "Linux man\-pages 6.05.01" .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 .PP \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. .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; 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\-Safe race:ap .TE .sp 1 .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 CAVEATS 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. .PP .EX #include #include \& void foo(char *fmt, ...) /* \[aq]...\[aq] is C syntax for a variadic function */ \& { va_list ap; int d; char c; char *s; \& va_start(ap, fmt); while (*fmt) switch (*fmt++) { case \[aq]s\[aq]: /* string */ s = va_arg(ap, char *); printf("string %s\en", s); break; case \[aq]d\[aq]: /* int */ d = va_arg(ap, int); printf("int %d\en", d); break; case \[aq]c\[aq]: /* char */ /* need a cast here since va_arg only takes fully promoted types */ c = (char) va_arg(ap, int); printf("char %c\en", c); break; } va_end(ap); } .EE .SH "ZOBACZ TAKŻE" \fBvprintf\fP(3), \fBvscanf\fP(3), \fBvsyslog\fP(3) .PP .SH TŁUMACZENIE Autorami polskiego tłumaczenia niniejszej strony podręcznika są: 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 .