Variabel funktion

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.

Eksempel i C

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

  1. va_starttager to argumenter, et objekt va_list  og en reference til funktionens sidste parameter (den før ellipsen). Det initialiserer va_listet objekt til brug i va_argeller va_copy. Compileren vil normalt udsende en advarsel, hvis referencen er ugyldig (for eksempel en reference til parametre, der adskiller sig fra sidstnævnte, eller en reference til et helt andet objekt).
  2. va_argtager to argumenter, va_listet objekt (tidligere initialiseret) og en typebeskrivelse. Det udvides til det næste variabelargument og har den angivne type. Hvert efterfølgende kald returnerer det næste argument.
  3. va_endtager et typeargument  va_listog rydder det. Hvis du for eksempel vil scanne et variabelt antal argumenter mere end én gang, skal du geninitialisere  va_list ved at kalde va_endog derefter  va_start.
  4. va_copytager to argumenter, begge af typen  va_list . Den dublerer den anden (som burde have været initialiseret) til den første.

Se også

Noter

  1. <cstdarg> (stdarg.h) - C++ reference . Hentet 13. februar 2016. Arkiveret fra originalen 31. oktober 2012.

Links