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