Namespaces
Variants

va_start

Начиная с ru.cppreference.net
 
 
Библиотека утилит
Поддержка языка
Поддержка типов (основные типы, RTTI)
Макросы тестирования возможностей библиотеки (C++20)
Программные утилиты
Вариативные функции
Поддержка корутин (C++20)
Поддержка контрактов (C++26)
Трёхстороннее сравнение
(C++20)
(C++20)(C++20)(C++20)    
(C++20)(C++20)(C++20)

Общие утилиты
Реляционные операторы (устарело в C++20)
Функции сравнения целых чисел
(C++20)(C++20)(C++20)    
(C++20)
Обмен и операции с типами
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
Общеупотребительные типы-словари
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)



 
 
Определён в заголовке <cstdarg>
void va_start( std::va_list ap, parmN );
(до C++26)
void va_start( std::va_list ap, ... );
(начиная с C++26)

Макрос va_start предоставляет доступ к дополнительным аргументампосле именованного аргумента parmN(до C++26).

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

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

(начиная с C++11)

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

(до C++26)

Если для va_start задано более одного аргумента, лексемы препроцессора, составляющие второй и последующие аргументы, игнорируются. Если любой из этих аргументов раскрывается в несбалансированные круглые скобки или лексему препроцессора, которая не преобразуется в токен, программа считается некорректной, диагностика не требуется.

(начиная с C++26)

Параметры

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 имеет ссылочный тип

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

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