Namespaces
Variants

va_start

From cppreference.net
Utilities library
Определено в заголовочном файле <cstdarg>
void va_start ( std :: va_list ap, parm_n ) ;

Макрос va_start обеспечивает доступ к переменным аргументам, следующим за именованным аргументом parm_n .

va_start должен вызываться с экземпляром корректного объекта va_list ap до любых вызовов va_arg .

Если parm_n является pack expansion или сущностью, полученной в результате lambda capture , программа является некорректной, диагностика не требуется.

(since C++11)

Если parm_n имеет ссылочный тип или тип, несовместимый с типом, получаемым в результате стандартных преобразований аргументов , поведение не определено.

Содержание

Параметры

ap - объект типа va_list
parm_n - именованный параметр, предшествующий первому переменному параметру

Развернутое значение

(нет)

Примечания

va_start требуется для поддержки parm_n с перегруженным operator& .

Пример

#include <cstdarg>
#include <iostream>
int add_nums(int count...)
{
    int result = 0;
    std::va_list args;
    va_start(args, count);
    for (int i = 0; i < count; ++i)
        result += va_arg(args, int);
    va_end(args);
    return result;
}
int main()
{
    std::cout << add_nums(4, 25, 25, 50, 50) << '\n';
}

Вывод:

150

Отчеты о дефектах

Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены ретроактивно к ранее опубликованным стандартам C++.

DR Applied to Behavior as published Correct behavior
CWG 273 C++98 было неясно, требуется ли от va_start
поддержка parm_n с перегруженным operator&
требуется
LWG 2099 C++98 поведение было неопределенным, если parm_n
объявлен с типом функции, массива или ссылки
поведение неопределено, если
parm_n имеет ссылочный тип

Смотрите также

обращается к следующему аргументу вариативной функции
(функциональный макрос)
завершает обход аргументов вариативной функции
(функциональный макрос)