C 库 - va_arg() 宏



C 的stdargva_arg() 宏用于接受可变数量参数的函数,并检索由va_start 初始化的 va_list(可变参数列表)中的下一个参数。

在使用 va_arg 之前,应使用 'va_start(ap, last_arg)' 或 'va_copy(ap, src_ap)'(如果参数是从另一个 va_list 复制的)初始化类型为 va_list 的对象 ap。两者之间不应出现对 va_end 的调用。

此宏对于可变参数函数非常有用,它从 arg_ptr 指向的位置检索指定类型的 value,并将 arg_ptr 加 1 以指向列表中的下一个参数。

语法

以下是 va_arg() 宏的 C 库语法:

type va_arg(va_list ap, type)

参数

此宏接受以下参数:

  • ap - 这是一个由 'va_start' 初始化的 va_list 类型变量。此变量用于遍历参数列表。

  • type - 它表示我们要检索的参数类型。它指定列表中下一个参数的数据类型。

返回值

此宏将下一个附加参数作为类型为 type 的表达式返回。

示例 1:数字求和

以下是一个基本的 C 示例,演示了 va_arg() 的用法。

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

int Sum_of_num(int n, ...) {
   int Sum = 0;
   va_list ptr;
   va_start(ptr, n);
   for (int i = 0; i < n; i++){
      Sum += va_arg(ptr, int);
   }        
   va_end(ptr);
   return Sum;
}
int main() {
   printf("1 + 2 is %d\n", Sum_of_num(2, 1, 2));
   printf("1 + 2 + 3 is %d\n", Sum_of_num(3, 1, 2, 3));
   printf("1 + 2 + 3 + 4 is %d\n", Sum_of_num(4, 1, 2, 3, 4));
   return 0;
}

输出

以下是输出:

1 + 2 is 3
1 + 2 + 3 is 6
1 + 2 + 3 + 4 is 10

示例 2:查找最大数

在这个例子中,我们使用 va_arg() 从传入的参数中查找最大数。

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

int Largest_num(int n, ...) {
   va_list ap;
   va_start(ap, n);
   int max = va_arg(ap, int);
   for (int i = 0; i < n - 1; i++) {
      int temp = va_arg(ap, int);
      max = temp > max ? temp : max;
   }
   va_end(ap);
   return max;
}

int main() {
   printf("%d\n", Largest_num(2, 1, 2));
   printf("%d\n", Largest_num(3, 1, 2, 3));
   printf("%d\n", Largest_num(4, 6, 2, 3, 4));
   return 0;
}

输出

以下是输出:

2
3
6

示例 3

让我们来看另一个例子,创建一个可变参数函数,该函数检索并打印传递给它的每个参数。

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

void print_numbers(int count, ...) {
   va_list args;

   // Initialize the va_list variable
   va_start(args, count);

   // Retrieve and display each argument
   for (int i = 0; i < count; i++) {
      int num = va_arg(args, int);
      printf("Argument %d: %d\n", i + 1, num);
   }
   // Clean the va_list
   va_end(args);
}
int main() {
   printf("Displaying 3 numbers:\n");
   print_numbers(3, 10, 20, 30);

   printf("\nDisplaying 5 numbers:\n");
   print_numbers(5, 1, 2, 3, 4, 5);

   return 0;
}

输出

以下是输出:

Displaying 3 numbers:
Argument 1: 10
Argument 2: 20
Argument 3: 30

Displaying 5 numbers:
Argument 1: 1
Argument 2: 2
Argument 3: 3
Argument 4: 4
Argument 5: 5
广告