Макрос библиотеки C -va_arg()
Стандартная библиотека C - <stdarg.h>
va_argЭтот макрос входит в стандартную библиотеку C<stdarg.h>Макрос в заголовочном файле, используемый для последовательного извлечения значения каждого переменного аргумента в функции с переменным числом аргументов. Он используется послеva_startинициализации макросаva_listпеременной, чтобы получить доступ к следующему аргументу в списке переменных аргументов.
Объявление
Ниже приведено объявление макроса va_arg().
type va_arg(va_list ap, type);
Параметр
va_list ap: одинva_listпеременная типа, которая уже была передана черезva_startМакрос инициализирует, указывая на текущую позицию в списке переменных аргументов.type: Тип следующего извлекаемого аргумента. Это должен быть тип, который можно однозначно идентифицировать.
Возвращаемое значение
Возвращает следующий аргумент в текущем списке переменных аргументов с типом type.
Шаги использования
- В функции с переменным числом аргументов используйте
va_startинициализацию макросаva_listпеременной. - Использование
va_argмакрос для последовательного получения каждого переменного аргумента. - Использование
va_endМакрос очисткиva_listпеременной.
Пример
Ниже показано использованиеva_argПример программы для макроса, которая определяет функцию с переменным числом аргументов для вычисления суммы переменного количества аргументов:
Пример
#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_argМакрос должен бытьva_startЗатем используйте его, и вva_endиспользован заранее.typeАргумент должен быть определённого типа, и он должен соответствовать фактическому типу переменного аргумента.- Если вызывать
va_argКогда оно превышает количество переменных аргументов, поведение не определено. - Использование
va_endочисткаva_listПеременная необходима, чтобы избежать потенциальных утечек ресурсов или неопределённого поведения.