Макрос библиотеки C -va_start()
Стандартная библиотека C - <stdarg.h>
Описание
va_startМакросы — это стандартная библиотека C.<stdarg.h>Макрос в заголовочном файле, используемый для инициализацииva_listпеременной, чтобы можно было получить доступ к количеству вариативных аргументов в вариативной функции.
Макрос библиотеки Cvoid va_start(va_list ap, last_arg)Инициализироватьapпеременную, которуюva_argиva_endМакросы используются вместе.last_arg— это последний известный фиксированный параметр, переданный функции, т. е. параметр перед многоточием.
Этот макрос должен использоваться вva_argиva_endбыл вызван раньше.
Объявление
Ниже приведено объявление макроса va_start().
void va_start(va_list ap, last);
Параметр
va_list ap: Это тип, используемый для доступа к вариативным аргументам. Он будет инициализирован после вызова макроса и использоваться в последующемva_argполучении аргументов при вызове.last: Это последний известный фиксированный параметр перед списком вариативных аргументов. То есть последний параметр в списке параметров функции перед началом вариативных аргументов.
Возвращаемое значение
Н/Д
Шаги использования
- Чтобы определить вариативную функцию, у вас должен быть хотя бы один фиксированный параметр (т. е.
lastпараметров). - Объявите
va_listПеременная, используемая для хранения информации о списке переменных аргументов. - Использование
va_startинициализацию макросаva_listпеременной. - Использование
va_argМакрос по очереди извлекает каждый переменный аргумент. - Использование
va_endМакрос очисткиva_listпеременной.
Пример
Следующий пример демонстрирует использование макроса va_start().
Пример
#include <stdarg.h>
// Функция с переменным числом аргументов, вычисляет сумму аргументов
int sum(int count, ...) {
int total = 0;
va_list args;
// Инициализировать args для доступа к вариативным аргументам
va_start(args, count);
// Получать каждый вариативный аргумент по одному и добавлять к total
for (int i = 0; i < count; i++) {
total += va_arg(args, int);
}
// Очистить args
va_end(args);
return total;
}
int main() {
printf("Сумма 1, 2, 3: %d\n", sum(3, 1, 2, 3)); // Вывод 6
printf("Сумма 4, 5, 6, 7: %d\n", sum(4, 4, 5, 6, 7)); // Вывод 22
return 0;
}
Давайте скомпилируем и запустим приведённую выше программу, которая выдаст следующий результат:
Sum of 1, 2, 3: 6 Sum of 4, 5, 6, 7: 22
Разбор
va_list args;: объявитеva_listпеременную типаargs, используемая для хранения информации о списке переменных аргументов.va_start(args, count);: инициализируйтеargsдля доступа кcountПеременные аргументы, которые начинаются после этого.total += va_arg(args, int);: Использоватьva_argМакрос извлекает следующий переменный аргумент, предполагая, что все ониintтипа, и накапливает его вtotalв переменной.va_end(args);: выполните очисткуargs, чтобы освободить ресурсы и избежать неопределённого поведения.
Примечания
va_startдолжен сva_list、va_argиva_endИспользуются вместе.- Вызов
va_startПосле этого необходимо вызватьva_endчтобы завершить обработку переменных аргументов. - При вызове
va_startПеред этим необходимо убедиться, что список параметров функции содержит хотя бы один фиксированный параметр. lastЭтот параметр — последний фиксированный параметр перед списком переменных аргументов; он используется, чтобы определить, с чего начать обработку переменных аргументов.