当前位置: C语言 -- 标准库 -- <stdarg.h> -- va_copy

va_copy宏


概要:
#include <stdarg.h>
void va_copy(va_list dest, va_list src);

描述:

va_copy是宏还是具有外部链接的标识符,ISO/IEC 9899:2018标准未作明确说明。如果为了访问实际函数而禁止宏va_copy定义,或者程序定义了名为va_copy的外部标识符,其行为是未定义的。

va_copy将参数dest初始化为参数src的副本,就好像宏va_start已应用于参数dest一样。对于同一dest,如果没有调用宏va_end结束其使用,则不应该调用宏va_start或者va_copy重新初始化dest。同一函数中宏va_start和宏va_copy的每次调用都应与对应的va_end宏调用相匹配。


参数:
va_list dest

va_list类型对象。

va_list src

va_list类型对象。


返回值:

该宏无返回值。


范例:
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
31 
32 
33 
34 
35 
36 
37 
38 
39 
40 
41 
42 
/*宏va_copy范例*/

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

/*计算偏差平方和。*/
void deviationSquaredSum(int N, ...)
{
    double average;  //平均数。
    double sum = 0;  //和。
    double dss = 0;  //偏差平方和。
    double temp;
    va_list number, numberBackup;

    va_start(number, N);
    va_copy(numberBackup, number);

    /*求平均数。*/
    for(int i=0; i<N; ++i)
    {
        sum += va_arg(numberBackup, double);
    }
    va_end(numberBackup);
    average = sum/N;

    /*求偏差平方和。*/
    for(int i=0; i<N; ++i)
    {
        temp = va_arg(number, double);
        dss += (temp - average)*(temp - average);
    }
    va_end(number);
    printf("Deviation squared sum: %.2f\n", dss);
}

int main(void)
{
    deviationSquaredSum(5, 10.30, 9.78, 9.87, 9.89, 10.20);

    return 0;
}

输出:

Deviation squared sum: 0.21


相关内容:
va_list 保存可变参数信息的类型。
va_arg 获取下一个参数的宏。
va_end 结束使用可变参数列表的宏。
va_start 初始化可变参数列表的宏。