va_arg
Определено в заголовке <stdarg.h> | ||
|---|---|---|
T va_arg( va_list ap, T ); |
Макрос va_arg расширяется до выражения типа T, которое соответствует следующему параметру из списка va_list ap.
Перед вызовом va_arg, ap должен быть инициализирован вызовом va_start или va_copy, без промежуточных вызовов va_end. Каждый вызов макроса va_arg изменяет ap на указание на следующий аргумент.
Если тип следующего аргумента в списке ap (после преобразований) не совместим с типом T, поведение не определено, за исключением случаев:
- один тип — целочисленный тип со знаком, другой — соответствующий целочисленный тип без знака, и значение представимо в обоих типах; или
- один тип — указатель на
void, другой — указатель на тип символа.
Если va_arg вызывается, когда больше нет аргументов в списке ap, поведение не определено.
Параметры
| ap | - | экземпляр типа va_list |
| T | - | тип следующего параметра в списке ap |
Расширенное значение
следующий переменный параметр в списке ap
Пример
#include <stdio.h>
#include <stdarg.h>
#include <math.h>
double stddev(int count, ...)
{
double sum = 0;
double sum_sq = 0;
va_list args;
va_start(args, count);
for (int i = 0; i < count; ++i) {
double num = va_arg(args, double);
sum += num;
sum_sq += num*num;
}
va_end(args);
return sqrt(sum_sq/count - (sum/count)*(sum/count));
}
int main(void)
{
printf("%f\n", stddev(4, 25.0, 27.3, 26.9, 25.7));
}Вывод:
0.920258
Ссылки
- Стандарт C11 (ISO/IEC 9899:2011):
- 7.16.1.1 Макрос va_arg (с. 269-270)
- Стандарт C99 (ISO/IEC 9899:1999):
- 7.15.1.1 Макрос va_arg (с. 249-250)
- Стандарт C89/C90 (ISO/IEC 9899:1990):
- 4.8.1.2 Макрос va_arg
См. также
|
(C99) | создает копию аргументов функции с переменным числом аргументов (макрос функции) |
| завершает обход аргументов функции с переменным числом аргументов (макрос функции) |
|
| хранит информацию, необходимую для va_start, va_arg, va_end и va_copy (typedef) |
|
| разрешает доступ к аргументам функции с переменным числом аргументов (макрос функции) |
|
Документация C++ по va_arg |
|
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/c/variadic/va_arg