C Переменные аргументы

Иногда вы можете столкнуться с ситуацией, когда хотите, чтобы функция имела переменное число аргументов, а не предопределённое число аргументов.

Язык C предоставляет решение для этой ситуации, позволяя вам определить функцию, которая может принимать переменное число аргументов в соответствии с конкретными требованиями.

Способ объявления таков:

int func_name(int arg1, ...);

Где многоточие...обозначает список переменных аргументов.

В следующем примере демонстрируется использование этой функции:

int func(int, ... ) { . . . } int main() { func(2, 2, 3); func(3, 2, 3, 4); }

Обратите внимание, функцияfunc()Последний параметр записывается как многоточие, т.е. три точки (...), параметр перед многоточием —int, который представляет общее количество передаваемых переменных аргументов. Чтобы использовать эту возможность, необходимо использоватьstdarg.hзаголовочный файл, который предоставляет функции и макросы для реализации переменного числа аргументов. Конкретные шаги следующие:

  • Определите функцию, последний параметр которой — многоточие, а перед многоточием можно задать пользовательские параметры.
  • В определении функции создайте переменную типаva_list, этот тип определён в заголовочном файле stdarg.h.
  • Использованиеintпараметров иva_start()макроса для инициализацииva_listпеременной в качестве списка параметров. Макросva_start()определён в заголовочном файле stdarg.h.
  • Использованиеva_arg()макроса иva_listпеременной для доступа к каждому элементу в списке аргументов.
  • Используйте макросva_end()для очистки выделеннойva_listпамяти переменной.

Обычно используемые макросы включают:

  • va_start(ap, last_arg): Инициализирует список переменных аргументов.apявляетсяva_listПеременная типа,last_arg— имя последнего фиксированного параметра (то есть параметра перед списком переменных аргументов). Этот макрос заставляетapуказывать на первый параметр в списке переменных аргументов.

  • va_arg(ap, type): Получить следующий параметр в списке переменных аргументов.apявляетсяva_listПеременная типа,type— это тип следующего параметра. Этот макрос возвращает значение типаtypeзначение, иapуказывает на следующий аргумент.

  • va_end(ap): завершает доступ к списку переменных аргументов.apявляетсяva_list— переменная этого типа. Этот макросapустанавливается вNULL。

Теперь давайте выполним описанные выше шаги, чтобы написать функцию с переменным числом параметров и вернуть их среднее значение:

Пример

#include <stdio.h> #include <stdarg.h> double average(int num,...) { va_list valist; double sum = 0.0; int i; /*Инициализировать valist для num аргументов*/ va_start(valist, num); /*Доступ ко всем аргументам, присвоенным valist*/ for (i = 0; i < num; i++) { sum += va_arg(valist, int); } /*Освободить память, зарезервированную для valist*/ va_end(valist); return sum/num; } int main() { printf("Среднее значение 2, 3, 4, 5 = %f\n", average(4, 2,3,4,5)); printf("Среднее значение 5, 10, 15 = %f\n", average(3, 5,10,15)); }

В приведённом выше примере функция average() принимает целое число num и любое количество целочисленных аргументов. Внутри функции переменная va_list типа va_list используется для доступа к списку аргументов переменной длины. В цикле каждый раз макрос va_arg() используется для получения следующего целочисленного аргумента и его вывода. Наконец, в конце функции макрос va_end() используется для завершения доступа к списку аргументов переменной длины.

Когда приведённый выше код скомпилирован и выполнен, он выдаёт следующие результаты. Следует отметить, что функция average()вызывается дважды, и каждый раз первый параметр указывает общее количество переданных аргументов переменной длины. Многоточие используется для передачи переменного числа аргументов.

Average of 2, 3, 4, 5 = 3.500000
Average of 5, 10, 15 = 10.000000
Другие расширения