命名空间
变体
动作

va_arg

来自 cppreference.cn
定义于头文件 <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 <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 宏 (页码: 待定)
  • C17 标准 (ISO/IEC 9899:2018)
  • 7.16.1.1 va_arg 宏 (页码: 待定)
  • 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 宏

[编辑] 参见

制作可变参数函数参数的副本
(函数宏) [编辑]
结束可变参数函数参数的遍历
(函数宏) [编辑]
保存 va_startva_argva_endva_copy 所需的信息
(类型定义) [编辑]
启用对可变参数函数参数的访问
(函数宏) [编辑]
C++ 文档 关于 va_arg