C Переменные аргументы
Иногда вы можете столкнуться с ситуацией, когда хотите, чтобы функция имела переменное число аргументов, а не предопределённое число аргументов.
Язык C предоставляет решение для этой ситуации, позволяя вам определить функцию, которая может принимать переменное число аргументов в соответствии с конкретными требованиями.
Способ объявления таков:
int func_name(int arg1, ...);
Где многоточие...обозначает список переменных аргументов.
В следующем примере демонстрируется использование этой функции:
Обратите внимание, функция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。
Теперь давайте выполним описанные выше шаги, чтобы написать функцию с переменным числом параметров и вернуть их среднее значение:
Пример
В приведённом выше примере функция 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Другие расширения