- C 标准库
- C 库 - 首页
- C 库 - <assert.h>
- C 库 - <complex.h>
- C 库 - <ctype.h>
- C 库 - <errno.h>
- C 库 - <fenv.h>
- C 库 - <float.h>
- C 库 - <inttypes.h>
- C 库 - <iso646.h>
- C 库 - <limits.h>
- C 库 - <locale.h>
- C 库 - <math.h>
- C 库 - <setjmp.h>
- C 库 - <signal.h>
- C 库 - <stdalign.h>
- C 库 - <stdarg.h>
- C 库 - <stdbool.h>
- C 库 - <stddef.h>
- C 库 - <stdio.h>
- C 库 - <stdlib.h>
- C 库 - <string.h>
- C 库 - <tgmath.h>
- C 库 - <time.h>
- C 库 - <wctype.h>
- C 标准库资源
- C 库 - 快速指南
- C 库 - 有用资源
- C 库 - 讨论
C 库 - va_arg() 宏
C 的stdarg 库 va_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
广告