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;
}