命名空间
变体
操作

va_start

来自 cppreference.com
在头文件 <stdarg.h> 中定义
void va_start( va_list ap, parmN );
(直到 C23)
void va_start( va_list ap, ... );
(自 C23 起)

va_start 宏允许访问可变参数 在命名的参数 parmN 之后(直到 C23).

在任何对 va_arg 的调用之前,必须使用有效的 va_list 对象 ap 实例来调用 va_start

如果 parmNregister 存储类说明符、数组类型、函数类型或与默认参数提升产生的类型不兼容的类型声明,则行为未定义。

(直到 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 宏 (p: 198-199)
  • C11 标准 (ISO/IEC 9899:2011)
  • 7.16.1.4 va_start 宏 (p: 271-272)
  • C99 标准 (ISO/IEC 9899:1999)
  • 7.15.1.4 va_start 宏 (p: 251-252)
  • C89/C90 标准 (ISO/IEC 9899:1990)
  • 4.8.1.1 va_start 宏

[编辑] 另请参阅

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