va_start

来自cppreference.com
< cpp‎ | utility‎ | variadic
 
 
工具库
通用工具
日期和时间
函数对象
格式化库 (C++20)
(C++11)
关系运算符 (C++20 中弃用)
整数比较函数
(C++20)(C++20)(C++20)
(C++20)
swap 与类型运算
(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_start 应当在任何对 va_arg 的调用前,以到合法 std::va_list 对象 ap 的实例调用。

parm_n包展开或源自 lambda 捕获的实体,则程序为非良构,不要求诊断。

(C++11 起)

parm_n 以引用类型,或与来自默认参数提升的结果不兼容的类型声明,则行为未定义。

参数

ap - std::va_list 类型的实例
parm_n - 首个可变参数前紧接的具名参数

展开值

(无)

注解

要求 va_start 支持带重载的 operator&parm_n

示例

#include <iostream>
#include <cstdarg>
 
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++ 标准。

缺陷报告 应用于 出版时的行为 正确行为
CWG 273 C++98 若重载了一元 operator&va_start 可能无法工作 即使重载了 operator& 也要求它正确工作

参阅

访问下一个可变函数实参
(宏函数)
结束对可变函数实参的遍历
(宏函数)