va_start
Определён в заголовочном файле <stdarg.h> | ||
|---|---|---|
void va_start( va_list ap, parmN ); | (до C23) | |
void va_start( va_list ap, ... ); | (начиная с C23) |
Макрос va_start предоставляет доступ к переменным аргументам, следующим за именованным аргументом parmN(до C23).
Перед любыми вызовами va_arg необходимо вызвать va_start, передав ему экземпляр допустимого объекта va_list ap.
| Если | (до C23) |
| Если для | (начиная с C23) |
Параметры
| ap | - | экземпляр типа va_list |
| parmN | - | именованный параметр, предшествующий первому переменному параметру |
Раскрываемое значение
(нет)
Пример
#include <stdarg.h>
#include <stdio.h>
int add_nums_C99(int count, ...)
{
int result = 0;
va_list args;
va_start(args, count); // count can be omitted since C23
for (int i = 0; i < count; ++i)
result += va_arg(args, int);
va_end(args);
return result;
}
#if __STDC_VERSION__ > 201710L
// Same as above, valid since C23
int add_nums_C23(...)
{
int result = 0;
va_list args;
va_start(args);
int count = va_arg(args, int);
for (int i = 0; i < count; ++i)
result += va_arg(args, int);
va_end(args);
return result;
}
#endif
int main(void)
{
printf("%d\n", add_nums_C99(4, 25, 25, 50, 50));
#if __STDC_VERSION__ > 201710L
printf("%d\n", add_nums_C23(4, 25, 25, 50, 50));
#endif
}
Возможный вывод:
150 150
Ссылки
- Стандарт C23 (ISO/IEC 9899:2024):
- 7.16.1.4 Макрос va_start (с. 290–292)
- Стандарт C17 (ISO/IEC 9899:2018):
- 7.16.1.4 Макрос va_start (с. 198–199)
- Стандарт C11 (ISO/IEC 9899:2011):
- 7.16.1.4 Макрос va_start (с. 271–272)
- Стандарт C99 (ISO/IEC 9899:1999):
- 7.15.1.4 Макрос va_start (с. 251–252)
- Стандарт C89/C90 (ISO/IEC 9899:1990):
- 4.8.1.1 Макрос va_start
См. также
| получает следующий аргумент вариативной функции (макрос функции) |
|
|
(C99) | создаёт копию аргументов вариативной функции (макрос функции) |
| завершает перебор аргументов вариативной функции (макрос функции) |
|
хранит информацию, необходимую для va_start, va_arg, va_end и va_copy (определение типа) |
|
Документация по C++ для va_start |
|
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/c/variadic/va_start