C 标准库 stdarg.h 是用于支持变参函数(Variadic functions)的头文件。它提供了实现此类函数的机制,能够让函数在编写时不需要定义参数的数量和类型。
1. va_arg
va_arg
函数用于获取变参函数中指定类型的参数,每次获取一个参数,需要传入该参数类型的 Type
,该函数会返回指定类型的值,并通过进一步操作来获取下一个参数值。
#include <stdarg.h>
#include <stdio.h>
int sum(int count, ...)
{
int s = 0;
va_list args;
va_start(args, count);
for (int i = 0; i < count; ++i) {
int arg = va_arg(args, int);
s += arg;
}
va_end(args);
return s;
}
int main()
{
printf("sum: %d\n", sum(5, 1, 2, 3, 4, 5));
return 0;
}
以上程序的执行结果为:sum: 15。
在上面的程序中,我们定义了一个包含变参函数 int sum(int count, ...)
,它的前置参数是整形变量 count
。变参使用 ...
表示函数有不定数量的参数。我们可以使用 va_list
定义一个列表,该列表包含所有变量参量的数量和类型信息。通过 va_start
宏定义该变参列表,然后使用 va_arg
获取列表中的值,逐个执行相应计算操作,使用 va_end
结束整个列表操作。
2. va_copy
一个变参列表在程序中仅可使用一次,此后如果需要再使用它,则需要进行复制操作。因此,C 标准库提供了一个宏 va_copy
,用于复制一个变参列表。
#include <stdarg.h>
#include <stdio.h>
int print_vars(int count, ...)
{
int s = 0;
va_list args;
va_start(args, count);
va_list copy;
va_copy(copy, args);
for (int i = 0; i < count; ++i) {
int arg = va_arg(args, int);
printf("%d\n", arg);
}
va_end(args);
printf("\n");
for (int i = 0; i < count; ++i) {
int arg = va_arg(copy, int);
printf("%d\n", arg);
}
va_end(copy);
}
int main()
{
print_vars(4, 1, 2, 3, 4);
return 0;
}
以上程序的执行结果为:
1
2
3
4
1
2
3
4
在上面的程序中,使用 va_copy
复制变参列表 args
,然后使用两个循环分别打印原列表 args
和复制列表 copy
中的所有元素。打印完后,使用 va_end
结束列表处理。
通过上面这两个示例,我们说明了 stdarg.h
C 标准库的 va_arg
和 va_copy
两个函数的使用方法,以及它们在变参函数中的支持作用。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C 标准库 stdarg.h - Python技术站