命名空间
变体
操作

va_arg

来自 cppreference.com
定义在头文件 <stdarg.h>
T va_arg( va_list ap, T );

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

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

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

  • 其中一个类型是有符号整型,另一个类型是相应的无符号整型,并且该值在两种类型中都可表示;或者
  • 其中一个类型是指向 void 的指针,而另一个类型是指向字符类型的指针。

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

内容

[编辑] 参数

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 宏 (p: 269-270)
  • C99 标准 (ISO/IEC 9899:1999)
  • 7.15.1.1 va_arg 宏 (p: 249-250)
  • C89/C90 标准 (ISO/IEC 9899:1990)
  • 4.8.1.2 va_arg 宏

[编辑] 参见

复制可变参数函数的参数
(函数宏) [编辑]
结束遍历可变参数函数的参数
(函数宏) [编辑]
保存 va_start、va_arg、va_end 和 va_copy 需要的信息
(typedef) [编辑]
启用访问可变参数函数参数
(函数宏) [编辑]
C++ 文档 for va_arg