Макрос библиотеки 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 <stdio.h>
#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Переменная необходима, чтобы избежать потенциальных утечек ресурсов или неопределённого поведения.

Стандартная библиотека C - <stdarg.h>

Другие расширения