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.
Если | (до C++26) | ||
| Если для | (начиная с C++26) |
Параметры
| ap | - | объект типа va_list |
| parm_n | - | именованный параметр, предшествующий первому параметру переменного числа |
Раскрываемое значение
(нет)
Примечания
| Для поддержки | (до 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 имеет ссылочный тип |
См. также
| получает доступ к следующему аргументу функции с переменным числом аргументов (макрос функции) |
|
| завершает обход аргументов функции с переменным числом аргументов (макрос функции) |
|
Документация по 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