I programmering kaldes funktioner med et variabelt antal argumenter for variadisk.
Der er mange matematiske og logiske operationer, der bedst implementeres ved hjælp af funktioner med et variabelt antal argumenter, såsom summering af tal eller sammenkædning af strenge.
For at implementere funktioner med et variabelt antal argumenter i programmeringssproget C, skal du inkludere header-filen stdarg.h. Tidligere brugt varargs.h, som er udgået. For C++ kaldes denne header-fil cstdarg[1] .
#include <stdarg.h> dobbelt gennemsnit ( int count , ...) { va_list ap ; int j ; dobbeltsum = 0 ; _ va_start ( ap , tælle ); /* Kræver det sidste kendte argument (for at få adressen på den første ukendte) */ for ( j = 0 ; j < antal ; j ++ ) { sum += va_arg ( ap , dobbelt ); /* Inkrementerer ap til næste argument. */ } va_end ( ap ); returnere sum / antal ; }Denne funktion giver dig mulighed for at beregne gennemsnitsværdien ud fra et vilkårligt antal argumenter. Bemærk, at funktionen ikke kender antallet af argumenter og deres typer. Funktionen fra eksemplet ovenfor forventer, at typerne er, doubleog at antallet af parametre sendes i det første argument. I andre tilfælde, såsom for funktionen printf() , udledes antallet og typen af argumenterne fra formatstrengen.
Generelt bør du være opmærksom på standardtype-forfremmelsesreglen, som siger, at alle funktionsargumenter fremmes, inklusive ukendte argumenter. Hvis de ukendte argumenter i eksemplet ovenfor blev erklæret af type float, ville de faktisk være af typen double, og funktionen ville forvente type double, ikke float. Dette kan skabe forvirring og fejl, hvis en funktion forventer et argument af en bestemt dimension, men modtager et argument af en anden dimension. Brugen af en makro NULLi variadiske funktioner er særligt farlig, da NULLden i C er defineret af en specifik implementering og ikke behøver at være null cast for at skrive void *, og i C++ er den defineret som 0 uden eksplicit konvertering til en pointer. Tallet 0 er af typen int, som har en minimumsstørrelse på 16 bit (2 bytes), hvilket sandsynligvis ikke er størrelsen af en pointer, der forventes i funktionen.
stdarg.h erklærer en type va_listog definerer fire makrofunktioner : va_start , va_argog va_copy .va_end