Namespaces
Variants

va_start

来自 zh.cppreference.net
 
 
 
 
定义于头文件 <cstdarg>
void va_start( std::va_list ap, parmN );
(C++26 前)
void va_start( std::va_list ap, ... );
(C++26 起)

va_start 宏允许访问命名实参 (C++26 前)parmN之后的变参。

va_start 必须用有效的 std::va_list 对象实例调用 ap,且在调用 va_arg 之前进行。

如果 parm_n 是包展开或源自lambda 捕获的实体,则程序非良构,无需诊断。

(C++11 起)

如果 parm_n 具有引用类型,或属于与默认实参提升结果类型不兼容的类型,则行为未定义。

(C++26 前)

如果 va_start 存在多于一个参数,则丢弃第二及后续参数的预处理记号。如果其中任何参数展开后包含不匹配的括号,或包含不能转换为记号的预处理记号,则程序非良构,无需诊断。

(C++26 起)

参数

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++ 标准。

缺陷报告 适用范围 发布时行为 正确行为
CWG 273 C++98 未明确说明 va_start 是否需要
支持重载了 operator& 的 parm_n
必须支持
LWG 2099 C++98 当 parm_n 被声明为函数类型、
数组类型或引用类型时行为未定义
仅当 parm_n 为引用类型时
行为未定义

参见

访问下一个可变参数函数实参
(函数宏)
结束可变参数函数实参的遍历
(函数宏)
C 文档 关于 va_start