# 变参数函数

< cpp‎ | utility

变参数函数是接收可变数量参数的函数（例如 std::printf ）。

为声明变参数函数，省略号要出现在参数列表后，例如 int printf(const char* format, ...); ，可以前附可选的逗号。语法上的额外细节、自动参数转换及替用项见变参数。

为从函数体内访问可变参数，标准库提供下列库设施：

定义于头文件 `<cstdarg>`
va_start | 启用对可变函数实参的访问 (宏函数)
va_arg | 访问下一个可变函数实参 (宏函数)
va_copy (C++11) | 制造可变函数实参的副本 (宏函数)
va_end | 结束对可变函数实参的遍历 (宏函数)
va_list | 保有 va_start、va_arg、va_end 和 va_copy 所需的信息 (typedef)

### 示例

    #include <iostream>
    #include <cstdarg>

    void simple_printf(const char* fmt...) // C 风格 "const char* fmt, ..." 亦合法
    {
        va_list args;
        va_start(args, fmt);

        while (*fmt != '\0') {
            if (*fmt == 'd') {
                int i = va_arg(args, int);
                std::cout << i << '\n';
            } else if (*fmt == 'c') {
                // 注意自动转换到整数类型
                int c = va_arg(args, int);
                std::cout << static_cast<char>(c) << '\n';
            } else if (*fmt == 'f') {
                double d = va_arg(args, double);
                std::cout << d << '\n';
            }
            ++fmt;
        }

        va_end(args);
    }

    int main()
    {
        simple_printf("dcff", 3, 'a', 1.999, 42.5);
    }

输出：

    3
    a
    1.999
    42.5

### 参阅