Макрос библиотеки 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: Это последний известный фиксированный параметр перед списком вариативных аргументов. То есть последний параметр в списке параметров функции перед началом вариативных аргументов.

Возвращаемое значение

Н/Д

Шаги использования

  1. Чтобы определить вариативную функцию, у вас должен быть хотя бы один фиксированный параметр (т. е.lastпараметров).
  2. Объявитеva_listПеременная, используемая для хранения информации о списке переменных аргументов.
  3. Использованиеva_startинициализацию макросаva_listпеременной.
  4. Использованиеva_argМакрос по очереди извлекает каждый переменный аргумент.
  5. Использованиеva_endМакрос очисткиva_listпеременной.

Пример

Следующий пример демонстрирует использование макроса va_start().

Пример

#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_startдолжен сva_list、va_argиva_endИспользуются вместе.
  • Вызовva_startПосле этого необходимо вызватьva_endчтобы завершить обработку переменных аргументов.
  • При вызовеva_startПеред этим необходимо убедиться, что список параметров функции содержит хотя бы один фиксированный параметр.
  • lastЭтот параметр — последний фиксированный параметр перед списком переменных аргументов; он используется, чтобы определить, с чего начать обработку переменных аргументов.

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

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