С переменным параметром
Иногда вы можете столкнуться с такой ситуацией, вы хотите работать с переменным числом аргументов, а не заранее заданное число аргументов. языка C для этого сценария обеспечивает решение, которое позволяет определить функцию, которая может принимать переменное число параметров в соответствии с конкретными потребностями. Следующий пример демонстрирует определение такой функции.
int func(int, ... ) { . . . } int main() { func(1, 2, 3); func(1, 2, 3, 4); }
Обратите внимание , что функцияFUNC () окончательное письменных аргументов Ellipsis , что три точки (...),что аргумент перед многоточием всегдаINT,представляющее общее число переменных передаваемых параметров. Чтобы использовать эту функцию, вам нужно использоватьstdarg.h файл заголовка , который обеспечивает функциональные возможности переменных параметров для достижения функций и макросов.Конкретные шаги заключаются в следующем:
- Определение функции, последний параметр многоточие, многоточие перед параметром всегдаINT, представляет количество параметров.
- Создайте переменную типаva_list в определении функции, этот тип определен в файле заголовка stdarg.h.
- Int параметры и использование макросов va_startдля инициализации переменнойva_listкак список параметров. Stdarg.h va_start макрос определен в файле заголовка.
- Используйтеva_arg макросы и va_listпеременные для доступа к списку параметров для каждого элемента.
- Используйте макрос для очисткиva_end данную va_listпеременную памяти.
Давайте теперь выполните действия, описанные выше, чтобы написать функции с переменным числом аргументов и возвращает их среднее значение:
#include <stdio.h> #include <stdarg.h> double average(int num,...) { va_list valist; double sum = 0.0; int i; /* 为 num 个参数初始化 valist */ 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("Average of 2, 3, 4, 5 = %f\n", average(4, 2,3,4,5)); printf("Average of 5, 10, 15 = %f\n", average(3, 5,10,15)); }
Когда приведенный выше код компилируется и выполняется, он производит следующий результат. Следует отметить , чтосредняя функция ()вызывается дважды, каждый раз , когда первый параметр представляет общее количество передаются переменными параметрами. Эллипсов используются для доставки переменное число аргументов.
Average of 2, 3, 4, 5 = 3.500000 Average of 5, 10, 15 = 10.000000