va_start

来自cppreference.com
 
 
 
 
在标头 <cstdarg> 定义
void va_start( std::va_list ap, parmN );
(C++26 前)
void va_start( std::va_list ap, ... );
(C++26 起)

va_start 宏使函数能访问跟在具名实参 parmN 后的(C++26 前)可变参数。

应当在任何对 va_arg 的调用前,以合法的 std::va_list 对象 ap 调用 va_start

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

(C++11 起)

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

(C++26 前)

如果 va_start 存在多个实参,那么组成第二实参与后续实参的预处理记号都会被丢弃。如果那些实参在展开后包含不平衡的圆括号或无法转换成记号的预处理记号,那么程序非良构,不要求诊断。

(C++26 起)

参数

ap - va_list 类型的对象
parm_n - 首个可变参数之前的具名形参

展开值

(无)

注解

va_start 需要支持重载了 operator&parm_n

(C++26 前)

示例

#include <cstdarg>
#include <iostream>

int add_nums(int count...)
{
    int result = 0;
    std::va_list args;
    va_start(args, count); // C++26 起能省略 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 具有引用类型时的行为未定义

参阅

访问下一个可变函数实参
(宏函数) [编辑]
结束对可变函数实参的遍历
(宏函数) [编辑]
va_start 的 C 文档
Morty Proxy This is a proxified and sanitized view of the page, visit original site.