# va_copy

< c‎ | variadic

定义于头文件 `<stdarg.h>` |  |
void va_copy( va_list dest, va_list src ); |  | (C99 起)

`va_copy` 宏把 `src` 复制到 `dest` 。

在函数返回，或 `dest` 的任何再初始化（通过调用 va_start 或 va_copy ）前，应该对 `dest` 调用 va_end 。

### 参数

dest | - | 待初始化的 va_list类型对象
src | - | 将用以初始化 `dest` 的源 va_list

### 展开值

（无）

### 示例

    #include <stdio.h>
    #include <stdarg.h>
    #include <math.h>

    double sample_stddev(int count, ...)
    {
        /* 以 args1 计算平均数。 */
        double sum = 0;
        va_list args1;
        va_start(args1, count);
        va_list args2;
        va_copy(args2, args1);   /* 复制 va_list 对象 */
        for (int i = 0; i < count; ++i) {
            double num = va_arg(args1, double);
            sum += num;
        }
        va_end(args1);
        double mean = sum / count;

        /* 以args2和平均数计算标准差。 */
        double sum_sq_diff = 0;
        for (int i = 0; i < count; ++i) {
            double num = va_arg(args2, double);
            sum_sq_diff += (num-mean) * (num-mean);
        }
        va_end(args2);
        return sqrt(sum_sq_diff / count);
    }

    int main(void)
    {
        printf("%f\n", sample_stddev(4, 25.0, 27.3, 26.9, 25.7));
    }

可能的输出：

    0.920258

### 引用

- C11 标准（ISO/IEC 9899:2011）：

  - 7.16.1.2 The va_copy macro (p: 270)

- C99 标准（ISO/IEC 9899:1999）：

  - 7.15.1.2 The va_copy macro (p: 250)

### 参阅

va_start | 令函数得以访问可变参数 (宏函数)
va_arg | 访问下一个函数可变参数 (宏函数)
va_end | 结束函数可变参数的行程 (宏函数)
va_list | 保有 va_start 、 va_arg 、 va_end 及 va_copy 所需信息 (typedef)