.\" -*- 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 "5 lutego 2023 r." "Linux man\-pages 6.03" 
.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 <stdarg.h>\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<stdarg.h>\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).
.ad l
.nh
.TS
allbox;
lbx lb lb
l l l.
Interfejs	Atrybut	Wartość
T{
\fBva_start\fP(),
\fBva_end\fP(),
\fBva_copy\fP()
T}	Bezpieczeństwo wątkowe	MT\-bezpieczne
T{
\fBva_arg\fP()
T}	Bezpieczeństwo wątkowe	MT\-bezpieczne race:ap
.TE
.hy
.ad
.sp 1
.SH STANDARDY
C99.
.SH USTERKI
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 <stdio.h>
#include <stdarg.h>

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\en", s);
            break;
        case \[aq]d\[aq]:              /* liczba całkowita */
            d = va_arg(ap, int);
            printf("liczba całkowita %d\en", 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\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 <pborys@dione.ids.pl>,
Andrzej Krzysztofowicz <ankry@green.mf.pg.gda.pl>,
Robert Luberda <robert@debian.org>
i
Michał Kułach <michal.kulach@gmail.com>
.
.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 .
