Variabel funktion

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.

Exempel i C

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

  1. va_starttar två argument, ett objekt va_list  och en referens till funktionens sista parameter (den före ellipsen). Den initierar va_listett objekt för användning i va_argeller va_copy. Kompilatorn kommer vanligtvis att ge en varning om referensen är ogiltig (till exempel en referens till parametrar som skiljer sig från den senare, eller en referens till ett helt annat objekt).
  2. va_argtar två argument, va_listett objekt (tidigare initierat) och en typdeskriptor. Den expanderar till nästa variabelargument och har den angivna typen. Varje efterföljande anrop returnerar nästa argument.
  3. va_endtar ett typargument  va_listoch rensar det. Om du till exempel vill skanna ett variabelt antal argument mer än en gång, måste du återinitiera  va_list genom att anropa va_endoch sedan  va_start.
  4. va_copytar två argument, båda av typen  va_list . Den duplicerar den andra (som borde ha initierats) till den första.

Se även

Anteckningar

  1. <cstdarg> (stdarg.h) - C++ Referens . Hämtad 13 februari 2016. Arkiverad från originalet 31 oktober 2012.

Länkar