I programmering kallas funktioner med ett variabelt antal argument för variadisk.
Det finns många matematiska och logiska operationer som bäst implementeras med funktioner med ett variabelt antal argument, som att summera tal eller sammanfoga strängar.
För att implementera funktioner med ett variabelt antal argument i programmeringsspråket C måste du inkludera rubrikfilen stdarg.h. Tidigare använd varargs.h, som är utfasad. För C++ kallas denna rubrikfil cstdarg[1] .
#include <stdarg.h> dubbelt medelvärde ( int count , ...) { va_list ap ; int j ; dubbelsumma = 0 ; _ va_start ( ap , count ); /* Kräver det senaste kända argumentet (för att få adressen till det första okända) */ för ( j = 0 ; j < count ; j ++ ) { summa += va_arg ( ap , dubbel ); /* Ökar ap till nästa argument. */ } va_end ( ap ); returnera summa / antal ; }Denna funktion låter dig beräkna medelvärdet från ett godtyckligt antal argument. Observera att funktionen inte känner till antalet argument och deras typer. Funktionen från exemplet ovan förväntar sig att typerna ska vara doubleoch att antalet parametrar skickas i det första argumentet. I andra fall, till exempel för funktionen printf() , härleds antalet och typen av argument från formatsträngen.
Generellt sett bör du vara medveten om standardtypen för befordran, som säger att alla funktionsargument främjas, inklusive okända argument. Således, om i exemplet ovan de okända argumenten deklarerades av typen float, skulle de faktiskt vara av typen double, och funktionen skulle förvänta sig typ double, inte float. Detta kan skapa förvirring och fel om en funktion förväntar sig ett argument av en viss dimension, men får ett argument av en annan dimension. Användningen av ett makro NULLi variadiska funktioner är särskilt farligt, eftersom NULLdet i C definieras av en specifik implementering och inte behöver vara nullcast för att typ void *, och i C++ definieras det som 0 utan explicit konvertering till en pekare. Siffran 0 är av typen int, som har en minimistorlek på 16 bitar (2 byte), vilket sannolikt inte är storleken på en pekare som förväntas i funktionen.
stdarg.h deklarerar en typ va_listoch definierar fyra makrofunktioner : va_start , va_argoch . va_copyva_end