Ohjelmoinnissa funktioita , joissa on vaihteleva määrä argumentteja , kutsutaan variadiciksi.
On monia matemaattisia ja loogisia operaatioita, jotka voidaan parhaiten toteuttaa käyttämällä funktioita, joissa on vaihteleva määrä argumentteja, kuten lukujen summaaminen tai merkkijonojen ketjuttaminen .
Jotta voit toteuttaa funktioita, joissa on vaihteleva määrä argumentteja C-ohjelmointikielellä, sinun on sisällytettävä otsikkotiedosto stdarg.h. Aiemmin käytetty varargs.h, joka on vanhentunut. C++:ssa tämän otsikkotiedoston nimi on cstdarg[1] .
#include <stdarg.h> kaksinkertainen keskiarvo ( int count , ...) { va_list ap ; int j ; kaksinkertainen summa = 0 ; va_start ( ap , count ); /* Vaatii viimeisen tunnetun argumentin (ensimmäisen tuntemattoman osoitteen saamiseksi) */ for ( j = 0 ; j < count ; j ++ ) { summa += va_arg ( ap , double ); /* Kasvata ap:ta seuraavaan argumenttiin. */ } va_end ( ap ); palautussumma / määrä ; _ }Tämän funktion avulla voit laskea keskiarvon mielivaltaisesta määrästä argumentteja. Huomaa, että funktio ei tiedä argumenttien määrää ja niiden tyyppejä. Yllä olevan esimerkin funktio odottaa, että tyypit ovat doubleja että parametrien määrä välitetään ensimmäisessä argumentissa. Muissa tapauksissa, kuten printf() -funktiossa , argumenttien lukumäärä ja tyypit päätellään muotomerkkijonosta.
Yleisesti ottaen sinun tulee olla tietoinen oletustyypin edistämissäännöstä, jonka mukaan kaikki funktion argumentit korotetaan, mukaan lukien tuntemattomat argumentit. Jos siis yllä olevassa esimerkissä tuntemattomat argumentit ilmoitettaisiin tyypeiksi float, ne olisivat itse asiassa tyyppiä doubleja funktio odottaisi tyyppiä double, ei float. Tämä voi aiheuttaa sekaannusta ja virheitä, jos funktio odottaa tietyn ulottuvuuden argumentin, mutta vastaanottaa eri ulottuvuuden argumentin. Makron NULLkäyttö variadicisissa funktioissa on erityisen vaarallista, koska NULLC:ssä sen määrittelee tietty toteutus, eikä sen tarvitse olla tyhjäksi tyypiksi void *, ja C++:ssa se määritellään 0:ksi ilman nimenomaista muuntamista osoittimeksi. Numero 0 on tyyppiä int, jonka vähimmäiskoko on 16 bittiä (2 tavua), mikä ei todennäköisesti ole funktiossa odotetun osoittimen koko.
stdarg.h ilmoittaa tyypin va_listja määrittää neljä makrofunktiota : va_start , va_argja va_copy .va_end