Namespaces
Variants

va_start

From cppreference.net
定义于头文件 <stdarg.h>
void va_start ( va_list ap, parmN ) ;
(C23前)
void va_start ( va_list ap, ... ) ;
(C23起)

va_start 宏支持访问 命名参数 parmN 之后 (C23前) 的可变参数。

va_start 必须在调用 va_arg 之前,通过有效的 va_list 对象 ap 进行调用。

parmN 声明带有 register 存储类说明符、数组类型、函数类型,或与默认参数提升后所得类型不兼容的类型,则行为未定义。

(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); // 自 C23 起可省略 count 参数
    for (int i = 0; i < count; ++i) {
        result += va_arg(args, int);
    }
    va_end(args);
    return result;
}
#if __STDC_VERSION__ > 201710L
// 与上述函数功能相同,自 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 宏 (页码: 198-199)
  • C11 标准 (ISO/IEC 9899:2011):
  • 7.16.1.4 va_start 宏 (页: 271-272)
  • C99标准(ISO/IEC 9899:1999):
  • 7.15.1.4 va_start宏(页码:251-252)
  • C89/C90 标准 (ISO/IEC 9899:1990):
  • 4.8.1.1 va_start 宏

参见

访问下一个可变参数函数实参
(函数宏)
(C99)
创建可变参数函数实参的副本
(函数宏)
结束可变参数函数实参的遍历
(函数宏)
持有 va_start va_arg va_end va_copy 所需的信息
(类型定义)
C++ 文档 关于 va_start