—правочник по C/C++
–абота с неопределЄнным числом параметров

—интаксис

язык C предоставл€ет возможность работать с неопределЄнным числом параметров в функци€х. —интаксис объ€влени€ функции следующий.

тип_возврата им€_функции(список_основных_параметров,
			тип_данных им€_параметра, ...)

«десь первый параметр им€_параметра необходим обозначени€ имени списка параметров и последующей ссылки обработчиками на список.

ћакросы-обработчики

ќбработка параметров происходит при помощи следующих макросов
Х va_start() Ч указатель списка параметров
Х va_arg() Ч берЄт аргумент из списка параметров
Х va_end() Ч закрывает указатель списка параметров
Х va_copy() Ч копирует список аргументов в объект

ќни объ€влены в заголовке <stdarg.h> и их синтаксис следующий

type va_arg(va_list argptr, type);
void va_copy(va_list target, va_list source);
void va_end(va_list argptr);
void va_start(va_list argptr, last_parm);

ћакросы va_arg, va_start и va_end работают вместе, чтобы сделать возможной передачу функции переменного числа аргументов. —амым распространенным примером функции, котора€ принимает переменное число аргументов, €вл€етс€ функци€ printf(). “ип va_list определен в заголовке <stdarg.h>(а в среде €зыка C++ Ч в заголовке <cstdarg>).

ќписание

ќбща€ процедура создани€ функции, котора€ может принимать переменное количество аргументов, такова. ‘ункци€ должна иметь по крайней мере один известный параметр(может и больше), указываемый до переменного списка параметров.  райний справа известный параметр называетс€ last_parm. ≈го им€ используетс€ в качестве второго параметра в обращении к макросу va_start(). ѕрежде чем можно будет получить доступ к любому параметру из списка параметров переменной длины, необходимо инициализировать указатель на аргумент argptr, обратившись к макросу va_start(). ѕосле этого параметры возвращаютс€ посредством обращени€ к макросу va_arg() с передачей значени€ параметра type, которое представл€ет собой тип следующего параметра. Ќаконец после прочтени€ всех параметров до возвращени€ из функции необходимо вызвать макрос va_end(), чтобы гарантировать корректное восстановление стека. ≈сли макрос va_end() не вызываетс€, высока веро€тность аварийного отказа программы.

ѕример

¬ следующей программе примен€етс€ функци€ sum_series(), котора€ возвращает сумму р€да чисел. ѕервый аргумент содержит количество аргументов, перечисленных за ним. ¬ этом примере суммируютс€ первые п€ть элементов следующего р€да чисел.

1     1     1      1          1
-  +  -  +  -  +  ЧЧ  ...  +  -
2     4     8     16          2n

–езультат равен 0.968750.

/* ѕример списка аргументов переменной длины сумма р€да . * /

#include <stdio.h>
#include <stdarg.h>

double sum_series(int, ...);

int main(void)
{
	double d;

	d = sum_series(5, 0.5, 0.25, 0.125, 0.0625, 0.03125);
	printf("—умма р€да равна %f\n",d);

	return 0;
}

double sum_series(int num, ...)
{
	double sum = 0.0, t;
	va_list argptr;

	/* »нициализируем указатель argptr. */
	va_start(argptr, num);

	/* —уммируем р€д. */
	for(; num; num--) {
		t = va_arg(argptr, double);
		sum += t;
	}

	/* –еализуем корректное завершение. */
	va_end(argptr);

	return sum;
}





–Э–µ—В –Ї–Њ–Љ–Љ–µ–љ—В–∞—А–Є–µ–≤.



–Ю—Б—В–∞–≤–Є—В—М –Ї–Њ–Љ–Љ–µ–љ—В–∞—А–Є–є:
–Т–∞—И–µ –Ш–Љ—П:
Email:
–Р–љ—В–Є–±–Њ—В: *  
–Т–∞—И –Ї–Њ–Љ–Љ–µ–љ—В–∞—А–Є–є: