Változó funkció

A programozásban  a változó számú argumentummal  rendelkező függvényeket variadicusnak nevezzük.

Számos matematikai és logikai művelet létezik, amelyeket a legjobban változó számú argumentumú függvényekkel lehet megvalósítani, például számok összegzésével vagy karakterláncok összefűzésével .

Példa a C-ben

A változó számú argumentumú függvények C programozási nyelvben való megvalósításához hozzá kell adni a fejlécfájlt   stdarg.h. Korábban használt  varargs.h, amely elavult. C++ esetén ennek a fejlécfájlnak a neve cstdarg[1] .

#include <stdarg.h> dupla átlag ( int count , ...) { va_list ap ; int j ; dupla összeg = 0 ; va_start ( ap , count ); /* Az utolsó ismert argumentum szükséges (az első ismeretlen címének lekéréséhez) */ for ( j = 0 ; j < szám ; j ++ ) { összeg += va_arg ( ap , double ); /* Növeli az ap-t a következő argumentumig. */ } va_end ( ap ); visszatérési összeg / szám ; }

Ez a függvény lehetővé teszi az átlagos érték kiszámítását tetszőleges számú argumentumból. Vegye figyelembe, hogy a függvény nem ismeri az argumentumok számát és típusát. A fenti példában szereplő függvény elvárja, hogy a típusok legyenek, doubleés hogy az első argumentumban a paraméterek száma kerüljön átadásra. Más esetekben, például a printf() függvény esetében, az argumentumok számát és típusát a rendszer a formátum karakterláncból vezeti le.

Általában ismernie kell az alapértelmezett típusú előléptetési szabályt, amely kimondja, hogy minden függvényargumentum előléptet, beleértve az ismeretlen argumentumokat is. Így, ha a fenti példában az ismeretlen argumentumok típusát deklarálnák float, akkor valójában típusúak lennének double, és a függvény típust várna double, nem float. Ez zavart és hibákat okozhat, ha egy függvény egy bizonyos dimenziójú argumentumot vár, de más dimenziójú argumentumot kap. A makró használata NULLa variadic függvényekben különösen veszélyes, mivel NULLC-ben egy adott implementáció határozza meg, és nem kell nulla cast-nak lennie típusba void *, a C++-ban pedig 0-ként van definiálva explicit mutatóvá alakítás nélkül. A 0 típusú szám int, amelynek minimális mérete 16 bit (2 bájt), ami valószínűleg nem akkora, mint a függvényben elvárt mutató.

stdarg.h típust deklarál va_list, és négy makrófüggvényt határoz meg : va_start , va_arg, va_copy és va_end.

  1. va_startkét argumentumot vesz fel, egy objektumot va_list  és egy hivatkozást a függvény utolsó paraméterére (az ellipszis előttire). Inicializál va_listegy objektumot a va_argvagy -ban való használatra va_copy. A fordító általában figyelmeztetést ad, ha a hivatkozás érvénytelen (például hivatkozás az utóbbitól eltérő paraméterekre, vagy egy teljesen más objektumra).
  2. va_argkét argumentumot vesz fel, va_listegy objektumot (korábban inicializálva) és egy típusleírót. A következő változó argumentumra bővül, és a megadott típussal rendelkezik. Minden következő hívás a következő argumentumot adja vissza.
  3. va_endvesz egy típusú argumentumot  va_list, és törli azt. Ha például változó számú argumentumot szeretne többször is megvizsgálni, akkor újra kell inicializálnia  va_list a hívással va_end, majd  a va_start.
  4. va_copykét argumentumot vesz fel, mindkettő  va_list típusú . Megkettőzi a másodikat (amit inicializálni kellett volna) az elsőbe.

Lásd még

Jegyzetek

  1. <cstdarg> (stdarg.h) - C++ Referencia . Letöltve: 2016. február 13. Az eredetiből archiválva : 2012. október 31..

Linkek