Spec-Zone.ru › C++

va_start

Определён в заголовочном файле <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 - именованный параметр, предшествующий первому параметру переменного числа

Раскрываемое значение

(нет)

Примечания

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

(до C++26)

Пример

#include <cstdarg>
#include <iostream>

int add_nums(int count...)
{
    int result = 0;
    std::va_list args;
    va_start(args, count); // count can be omitted since C++26
    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 Применён к Поведение согласно опубликованной версии Корректное поведение
CWG 273 C++98 было неясно, требуется ли va_start для
поддержки parm_n с перегруженными operator&
требуется
LWG 2099 C++98 поведение не было определено, если parm_n
объявлен с типом функции, массива или ссылки
поведение не определено, если
parm_n имеет ссылочный тип

См. также

va_arg
получает доступ к следующему аргументу функции с переменным числом аргументов
(макрос функции)
va_end
завершает обход аргументов функции с переменным числом аргументов
(макрос функции)
Документация по C для va_start

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/utility/variadic/va_start

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API