În programare, funcțiile cu un număr variabil de argumente se numesc variadice.
Există multe operații matematice și logice care sunt cel mai bine implementate folosind funcții cu un număr variabil de argumente, cum ar fi însumarea numerelor sau concatenarea șirurilor.
Pentru a implementa funcții cu un număr variabil de argumente în limbajul de programare C, trebuie să includeți fișierul antet stdarg.h. Folosit anterior varargs.h, care a fost depreciat. Pentru C++, acest fișier antet se numește cstdarg[1] .
#include <stdarg.h> medie dublă ( număr de int , ...) { va_list ap ; int j ; sumă dublă = 0 ; va_start ( ap , count ); /* Necesită ultimul argument cunoscut (pentru a obține adresa primului necunoscut) */ pentru ( j = 0 ; j < numără ; j ++ ) { sum += va_arg ( ap , double ); /* Crește ap la următorul argument. */ } va_end ( ap ); returnare sumă / număr ; }Această funcție vă permite să calculați valoarea medie dintr-un număr arbitrar de argumente. Rețineți că funcția nu cunoaște numărul de argumente și tipurile acestora. Funcția din exemplul de mai sus se așteaptă ca tipurile să fie doubleși ca numărul de parametri să fie trecut în primul argument. În alte cazuri, cum ar fi pentru funcția printf() , numărul și tipurile de argumente sunt deduse din șirul de format.
În general, ar trebui să fiți conștienți de regula implicită de promovare a tipului, care afirmă că toate argumentele funcției sunt promovate, inclusiv argumentele necunoscute. Astfel, dacă în exemplul de mai sus argumentele necunoscute ar fi declarate de tip float, ele ar fi de fapt de tip double, iar funcția s-ar aștepta la tip double, nu float. Acest lucru poate introduce confuzie și erori dacă o funcție așteaptă un argument de o anumită dimensiune, dar primește un argument de o dimensiune diferită. Utilizarea unei macrocomenzi NULLîn funcțiile variadice este deosebit de periculoasă, deoarece NULLîn C este definită printr-o implementare specifică și nu trebuie să fie null la tipul void *, iar în C++ este definită ca 0 fără conversie explicită la un pointer. Numărul 0 este de tipul int, care are o dimensiune minimă de 16 biți (2 octeți), ceea ce probabil nu este dimensiunea unui pointer așteptat în funcție.
stdarg.h declară un tip și va_listdefinește patru funcții macro : va_start , va_argși va_copy .va_end