C 库 - va_copy() 宏

C stdarg 库中的 va_copy() 宏用于将 va_list 变量(src)的状态复制到另一个 va_list 变量(dest)。

应在函数返回之前或在 va_start 或 va_copy 重新初始化 va_list 之前,在 va_end 上调用 va_end 宏。

当在同一个函数中,我们需要多次迭代同一个参数列表时,此宏非常有用。一次。

语法

以下是 va_copy() 宏的 C 库语法 -

void va_copy( va_list dest, va_list src )

参数

此宏接受以下参数 -

  • dest - 它表示将接收状态副本的 va_list 变量的实例。

  • src - 它表示要复制的源 va_list 变量。

返回值

此宏不返回任何值。

示例 1:计算总和和平均值

以下是演示 va_copy() 用法的基本 C 代码示例。

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

void sum_and_average(int count, ...) {
    va_list args, args_copy;
    int sum = 0;
    
    // 初始化 va_list
    va_start(args, count);
    
    // 复制 va_list
    va_copy(args_copy, args);
    
    // 使用原始 va_list 计算总和
    for (int i = 0; i < count; i++) {
        sum += va_arg(args, int);
    }
    printf("Sum: %d", sum);
    
    // 使用复制的 va_list 计算平均值
    double average = 0.0;
    if (count > 0) {
      for (int i = 0; i < count; i++) {
         average += va_arg(args_copy, int);
      }
      average = average/count;
    }
    printf("Average: %.2f", average);
    
    // 清理两个 va_list 变量
    va_end(args);
    va_end(args_copy);
}
int main() {
   printf("Calculating for 3 numbers:");
   sum_and_average(3, 10, 20, 30);

   printf("Calculating for 5 numbers:");
   sum_and_average(5, 1, 2, 3, 4, 5);

   return 0;
}

输出

以下是输出 -

Calculating for 3 numbers:
Sum: 60
Average: 20.00

Calculating for 5 numbers:
Sum: 15
Average: 3.00

示例 2:计算标准差

以下 C 语言示例使用 va_copy() 将"src"va_list 复制到"dest",并计算标准差。

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

double ComputeMean(int count, ...) {
   va_list args1, args2;
   va_start(args1, count);
   // 复制 args1
   va_copy(args2, args1);

   double sum = 0;
   for (int i = 0; i < count; ++i) {
      double num = va_arg(args1, double);
      sum = sum + num;
   }
   va_end(args1);

   double mean = sum / count;

    // 计算标准差
    // 使用复制的 va_list (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() {
   printf("Standard deviation: %lf", ComputeMean(4, 1.0, 2.0, 3.0, 4.0));
   return 0;
}

输出

以下是输出 -

Standard deviation: 1.118034