Funcție variabilă

Î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.

Exemplu în C

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

  1. va_startia două argumente, un obiect va_list  și o referință la ultimul parametru al funcției (cel dinaintea punctelor de suspensie). Inițializează va_listun obiect pentru a fi utilizat în va_argsau va_copy. Compilatorul va emite de obicei un avertisment dacă referința este invalidă (de exemplu, o referință la parametri care diferă de cei din urmă sau o referire la un obiect complet diferit).
  2. va_argia două argumente, va_listun obiect (inițializat anterior) și un descriptor de tip. Se extinde la următorul argument al variabilei și are tipul specificat. Fiecare apel ulterior returnează următorul argument.
  3. va_endia un singur argument tip  va_listși îl șterge. Dacă doriți, de exemplu, să scanați un număr variabil de argumente de mai multe ori, va trebui să reinițializați  va_list apelând va_endși apoi  va_start.
  4. va_copyia două argumente, ambele de tip  va_list . Îl dublează pe al doilea (care ar fi trebuit inițializat) în primul.

Vezi și

Note

  1. <cstdarg> (stdarg.h) - Referință C++ . Consultat la 13 februarie 2016. Arhivat din original la 31 octombrie 2012.

Link -uri