У програмуванні, фу́нкції зі змі́нним число́м аргуме́нтів називають варіативними.
Існує багато математичних і логічних операцій, які краще реалізувати за допомогою функцій зі змінною кількістю аргументів, наприклад, підсумовування чисел або конкатенація рядків.
Приклад у C
Для реалізації функцій зі змінним числом аргументів у мові програмування C потрібно підключити заголовний файл stdarg.h
. Раніше використовувався , який оголошено застарілим. Для C++ цей заголовний файл називається
cstdarg
.
#include <stdarg.h> double average(int count, ...) { va_list ap; int j; double sum = 0; va_start(ap, count); /* Потрібен останній відомий аргумент (щоб отримати адресу першого невідомного) */ for (j = 0; j < count; j++) { sum += va_arg(ap, double); /* Збільшує ap до наступного аргументу. */ } va_end(ap); return sum / count; }
Ця функція дозволяє обчислити середнє значення від довільної кількості аргументів. Зверніть увагу, що функція не знає числа аргументів і їх типів. Функція з прикладу вище очікує, що типи будуть double
і що число параметрів передається першим аргументом. В інших випадках, наприклад для функції , число і типи аргументів з'ясовуються за рядком формату.
У загальному випадку варто знати про правило підвищення типів за замовчуванням, за яким підвищення типів зазнають усі аргументи функції, включно з невідомими аргументами. Так, якби в прикладі вище невідомі аргументи були оголошені типу float
, фактично вони б виявилися типу double
, і очікувати функція мала б тип double
, а не float
. Це може спричинити плутанину й помилки, якщо функція очікує аргумент певного розміру, а отримує аргумент іншого розміру. Особливо небезпечним є використання макроса NULL
у варіативних функціях, оскільки NULL
у C визначається конкретною реалізацією і не зобов'язаний бути нулем, зведеним до типу void *
, а в C++ визначений як 0 без явного зведення до вказівника. Число 0 має тип int
, найменший розмір якого відповідає 16 бітам (2 байти), що, найпевніш, не відповідатиме розміру очікуваного у функції вказівника.
оголошує тип
va_list
, і визначає чотири макрофункції: va_start, va_arg
, va_copy
і va_end
. Кожному виклику va_start і va_copy
має відповідати виклик va_end
. Під час роботи зі змінним числом аргументів функція зазвичай оголошує змінну типу va_list
(ap
у прикладі), якою маніпулюватимуть макроси.
va_start
приймає два аргументи: об'єктva_list
і посилання на останній параметр функції (той, що перед трикрапкою). Вона ініціалізує об'єктva_list
для використання уva_arg
абоva_copy
. Компілятор зазвичай виводить попередження, якщо посилання хибне (наприклад, посилання на параметри, що відрізняються від останнього, або посилання на зовсім інший об'єкт).va_arg
приймає два аргументи: об'єктva_list
(раніше ініціалізований) і дескриптор типу. Він розширюється на наступний аргумент і має вказаний тип. Кожен наступний виклик повертає наступний аргумент.va_end
приймає один аргумент типуva_list
і очищає його. Якщо потрібно, наприклад, опрацювати змінне число аргументів більш ніж один раз, слід повторно ініціалізуватиva_list
, викликавшиva_end
і потімva_start
.va_copy
приймає два аргументи, обидва типи va_list. Він дублює другий (який повинен був бути ініціалізованим) у перший.
Див. також
- Варіативний макрос (мова програмування C)
- Варіативний шаблон
Примітки
- . Архів оригіналу за 31 жовтня 2012. Процитовано 29 березня 2022.
Посилання
- Variadic function [ 13 лютого 2021 у Wayback Machine.] — задача Rosetta Code, що показує реалізацію варіативних функцій у більш ніж п'ятдесяти мовах програмування.
- — посібник про функції зі змінним числом аргументів у C++
- GNU libc manual [ 31 грудня 2010 у Wayback Machine.]
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
U programuvanni fu nkciyi zi zmi nnim chislo m argume ntiv nazivayut variativnimi Isnuye bagato matematichnih i logichnih operacij yaki krashe realizuvati za dopomogoyu funkcij zi zminnoyu kilkistyu argumentiv napriklad pidsumovuvannya chisel abo konkatenaciya ryadkiv Priklad u CDlya realizaciyi funkcij zi zminnim chislom argumentiv u movi programuvannya C potribno pidklyuchiti zagolovnij fajl stdarg h Ranishe vikoristovuvavsya yakij ogolosheno zastarilim Dlya C cej zagolovnij fajl nazivayetsya cstdarg include lt stdarg h gt double average int count va list ap int j double sum 0 va start ap count Potriben ostannij vidomij argument shob otrimati adresu pershogo nevidomnogo for j 0 j lt count j sum va arg ap double Zbilshuye ap do nastupnogo argumentu va end ap return sum count Cya funkciya dozvolyaye obchisliti serednye znachennya vid dovilnoyi kilkosti argumentiv Zvernit uvagu sho funkciya ne znaye chisla argumentiv i yih tipiv Funkciya z prikladu vishe ochikuye sho tipi budut double i sho chislo parametriv peredayetsya pershim argumentom V inshih vipadkah napriklad dlya funkciyi chislo i tipi argumentiv z yasovuyutsya za ryadkom formatu U zagalnomu vipadku varto znati pro pravilo pidvishennya tipiv za zamovchuvannyam za yakim pidvishennya tipiv zaznayut usi argumenti funkciyi vklyuchno z nevidomimi argumentami Tak yakbi v prikladi vishe nevidomi argumenti buli ogolosheni tipu float faktichno voni b viyavilisya tipu double i ochikuvati funkciya mala b tip double a ne float Ce mozhe sprichiniti plutaninu j pomilki yaksho funkciya ochikuye argument pevnogo rozmiru a otrimuye argument inshogo rozmiru Osoblivo nebezpechnim ye vikoristannya makrosa NULL u variativnih funkciyah oskilki NULL u C viznachayetsya konkretnoyu realizaciyeyu i ne zobov yazanij buti nulem zvedenim do tipu void a v C viznachenij yak 0 bez yavnogo zvedennya do vkazivnika Chislo 0 maye tip int najmenshij rozmir yakogo vidpovidaye 16 bitam 2 bajti sho najpevnish ne vidpovidatime rozmiru ochikuvanogo u funkciyi vkazivnika ogoloshuye tip va list i viznachaye chotiri makrofunkciyi va start va arg va copy i va end Kozhnomu vikliku va start i va copy maye vidpovidati viklik va end Pid chas roboti zi zminnim chislom argumentiv funkciya zazvichaj ogoloshuye zminnu tipu va list ap u prikladi yakoyu manipulyuvatimut makrosi va start prijmaye dva argumenti ob yekt va list i posilannya na ostannij parametr funkciyi toj sho pered trikrapkoyu Vona inicializuye ob yekt va list dlya vikoristannya u va arg abo va copy Kompilyator zazvichaj vivodit poperedzhennya yaksho posilannya hibne napriklad posilannya na parametri sho vidriznyayutsya vid ostannogo abo posilannya na zovsim inshij ob yekt va arg prijmaye dva argumenti ob yekt va list ranishe inicializovanij i deskriptor tipu Vin rozshiryuyetsya na nastupnij argument i maye vkazanij tip Kozhen nastupnij viklik povertaye nastupnij argument va end prijmaye odin argument tipu va list i ochishaye jogo Yaksho potribno napriklad opracyuvati zminne chislo argumentiv bilsh nizh odin raz slid povtorno inicializuvati va list viklikavshi va end i potim va start va copy prijmaye dva argumenti obidva tipi va list Vin dublyuye drugij yakij povinen buv buti inicializovanim u pershij Div takozhVariativnij makros mova programuvannya C Variativnij shablonPrimitki Arhiv originalu za 31 zhovtnya 2012 Procitovano 29 bereznya 2022 PosilannyaVariadic function 13 lyutogo 2021 u Wayback Machine zadacha Rosetta Code sho pokazuye realizaciyu variativnih funkcij u bilsh nizh p yatdesyati movah programuvannya posibnik pro funkciyi zi zminnim chislom argumentiv u C GNU libc manual 31 grudnya 2010 u Wayback Machine