可变参数与 stdarg.h 库
在 C 语言中,有时候需要编写具有可变数量参数的函数,例如 printf 函数就接受可变数量的参数。为了处理这种情况,C 标准库提供了 <stdarg.h>
头文件,其中定义了一些宏和变量类型,以便在参数个数未知时获取函数中的参数。
va_list 变量类型
va_list
是一个类型,用于存储由 va_start()
、va_arg()
和 va_end()
这三个宏处理的信息。
库宏
va_start()
#include <stdio.h>
#include <stdarg.h>
void print_ints(int num, ...) {
va_list args;
va_start(args, num);
for (int i = 0; i < num; ++i) {
int value = va_arg(args, int);
printf("%d: %d\n", i, value);
}
va_end(args);
}
int main() {
print_ints(3, 10, 20, 30);
return 0;
}
va_arg()
#include <stdio.h>
#include <stdarg.h>
void print_strings(int num, ...) {
va_list args;
va_start(args, num);
for (int i = 0; i < num; ++i) {
char *value = va_arg(args, char*);
printf("%d: %s\n", i, value);
}
va_end(args);
}
int main() {
print_strings(3, "Hello", "World", "!");
return 0;
}
va_end()
#include <stdio.h>
#include <stdarg.h>
void print_doubles(int num, ...) {
va_list args;
va_start(args, num);
for (int i = 0; i < num; ++i) {
double value = va_arg(args, double);
printf("%d: %.2f\n", i, value);
}
va_end(args);
}
int main() {
print_doubles(3, 3.14, 2.718, 1.618);
return 0;
}
这些例子展示了如何使用 <stdarg.h>
中的宏来处理可变数量的参数。va_start()
宏用于初始化参数列表,va_arg()
宏用于检索参数列表中的下一个参数,而 va_end()
宏用于结束对参数的处理。通过这些功能,我们可以在不知道参数个数的情况下编写更加灵活的函数。