命名空间
变体
操作

va_start

来自 cppreference.com
< cpp‎ | utility‎ | variadic
 
 
实用程序库
语言支持
类型支持 (基本类型,RTTI)
库功能测试宏 (C++20)
动态内存管理
程序实用程序
协程支持 (C++20)
可变参数函数
调试支持
(C++26)
三方比较
(C++20)
(C++20)(C++20)(C++20)
(C++20)(C++20)(C++20)
通用工具
日期和时间
函数对象
格式化库 (C++20)
(C++11)
关系运算符 (C++20 中已弃用)
整数比较函数
(C++20)(C++20)(C++20)   
(C++20)
交换类型操作
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
通用词汇类型
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)
基本字符串转换
(C++17)
(C++17)

 
 
定义在头文件 <cstdarg>
void va_start( std::va_list ap, parm_n );

va_start 宏允许访问在命名参数 parm_n 之后的可变参数。

在调用 va_arg 之前,应该使用有效的 va_list 对象 ap 实例调用 va_start

如果 parm_n包展开lambda 捕获 产生的实体,则程序格式错误,不需要诊断。

(自 C++11 起)

如果 parm_n 是引用类型,或与 默认参数提升 所产生的类型不兼容的类型,则行为未定义。

内容

[编辑] 参数

ap - va_list 类型的对象
parm_n - 第一个可变参数之前的命名参数

[编辑] 扩展值

(无)

[编辑] 注意

va_start 要求支持具有重载 operator&parm_n

[编辑] 示例

#include <cstdarg>
#include <iostream>
 
int add_nums(int count...)
{
    int result = 0;
    std::va_list args;
    va_start(args, count);
    for (int i = 0; i < count; ++i)
        result += va_arg(args, int);
    va_end(args);
    return result;
}
 
int main()
{
    std::cout << add_nums(4, 25, 25, 50, 50) << '\n';
}

输出

150

[编辑] 缺陷报告

以下行为更改缺陷报告被追溯应用于先前发布的 C++ 标准。

DR 应用于 已发布的行为 正确行为
CWG 273 C++98 不清楚 va_start 是否需要
支持具有重载 operator&parm_n
需要
LWG 2099 C++98 如果 parm_n
用函数、数组或引用类型声明的行为未定义
如果
parm_n 是引用类型,则行为未定义

[编辑] 另请参阅

访问下一个可变参数函数参数
(函数宏) [编辑]
结束可变参数函数参数的遍历
(函数宏) [编辑]
C 文档 for va_start