мета-данные страницы
stdarg.h
Для определения параметров неопределенной длины в таких функциях используется многоточие:
тип имя_функции(обязательные параметры, …)
При этом надо учитывать, что функция должна иметь как минимум один обязательный параметр.
в заглоловочном файле stdarg.h определены специальные макрокоманды:
va_start(); va_arg(); va_end();
Макрос va_start имеет следующее определение:
void va_start(va_list param, последний_явный_параметр);
Первый параметр макроса - param связывает объект va_list с первым необязательным параметром. Для его определения в качестве второго параметра в макрос передается последний обязательный параметр функции. Таким образом, используя последний обязательный параметр, мы можем нацелить объект va_list на адрес первого необязательного параметра. То есть фактически va_list выступает в данной роли как указатель.
Макрос va_arg имеет следующее определение:
type va_arg(va_list param, type);
Этот макрос позволяет получить значение параметра типа type, а также переместить указатель va_list на следующий необязательный параметр.
Макрос va_end позволяет выйти из функции с переменным списком параметров. Она имеет следующее определение:
void va_end(va_list param);
В качестве параметра va_end принимает указатель va_start, который ранее был задействован в макросах va_start и va_arg.
Пример:
#include <stdio.h> #include <stdarg.h> int sum(int n, ...) { int result = 0; va_list factor; //указатель va_list va_start(factor, n); // устанавливаем указатель for(int i=0;i<n; i++) { result += va_arg(factor, int); // получаем значение текущего параметра типа int } va_end(factor); // завершаем обработку параметров return result; } int main(void) { printf("%d \n", sum(4, 1, 2, 3, 4)); printf("%d \n", sum(5, 12, 21, 13, 4, 5)); return 0; }