Namespaces
Variants

va_start

From cppreference.net
Определено в заголовке <stdarg.h>
void va_start ( va_list ap, parmN ) ;
(до C23)
void va_start ( va_list ap, ... ) ;
(начиная с C23)

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

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

Если parmN объявлен с указателем класса хранения register , с типом массива, с типом функции или с типом, не совместимым с типом, который получается в результате стандартных преобразований аргументов, поведение не определено.

(до C23)

Только первый аргумент, переданный в va_start , вычисляется. Любые дополнительные аргументы не раскрываются и не используются каким-либо образом.

(начиная с C23)

Содержание

Параметры

ap - экземпляр типа va_list
parmN - именованный параметр, предшествующий первому переменному параметру

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

(нет)

Пример

#include <stdio.h>
#include <stdarg.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

Ссылки

  • Стандарт 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
(определение типа)