Namespaces
Variants

va_arg

From cppreference.net
定义于头文件 <stdarg.h>
T va_arg ( va_list ap, T ) ;

va_arg 宏展开为一个类型为 T 的表达式,该表达式对应于来自 va_list ap 的下一个参数。

在调用 va_arg 之前,必须通过调用 va_start va_copy 来初始化 ap ,且期间不能调用 va_end 。每次调用 va_arg 宏都会修改 ap 以指向下一个可变参数。

如果 ap 中下一个参数的类型(经提升后)与 T 兼容 ,则行为未定义,除非:

  • 一种类型是有符号整数类型,另一种类型是对应的无符号整数类型,且该值在两种类型中均可表示;或
  • 一种类型是指向 void 的指针,另一种类型是指向字符类型的指针。

如果在 ap 中没有更多参数时调用 va_arg ,其行为是未定义的。

目录

参数

ap - va_list 类型的一个实例
T - ap 中下一个参数的类型

展开值

下一个可变参数在 ap

示例

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

参考文献

  • C23 标准 (ISO/IEC 9899:2024):
  • 7.16.2.2 va_arg 宏 (页: TBD)
  • C17 标准 (ISO/IEC 9899:2018):
  • 7.16.1.1 va_arg 宏 (页: TBD)
  • 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 所需的信息
(类型定义)
启用对可变函数参数的访问
(函数宏)
C++ 文档 关于 va_arg