一,可变参数
1.基础概念
可变参数在C语言和C++语言编程中都有应用。
可变参数的含义是:在函数传参的时候,参数的数量、类型都是可变的,不确定的。
在C语言中,应用到可变参数的是可变参数函数和可变参数的宏。
在C++语言中,C++11标准提供了两种使用可变参数的方式:
1.如果可变参数的参数类型相同,可以使用标准库中的initializer_list。
2.如果可变参数的参数类型不同,可以使用可变参数模板。
C语言中,在定义可变参数函数时,使用省略号"..."表示参数是可变的。
简单代码样例如下:
void printf(const char* format, …);
可变参数的使用可以让代码结构更精简。
2.可变参数相关的宏定义
在C语言中,一般需要借助相关的宏定义来实现可变参数,常见的宏定义如下:
va_arg:每一次调用va_arg会获取当前的参数,并自动更新指向下一个可变参数。
va_start:获得可变参数列表的第一个参数,开始使用可变参数列表。
va_end:结束对可变函数列表的遍历,释放va_list。
va_list:存储可变参数列表的具体信息。
简单介绍就是,va_start用于开始使用可变参数,va_arg用于获得下一个可变参数,va_end用于释放va_list。
它们都包含在头文件"<stdarg.h>"中
这些宏定义在具体应用时的语法如下:
type va_arg(
va_list arg_ptr,
type
);
void va_end(
va_list arg_ptr
);
void va_start(
va_list arg_ptr,
prev_param
);
void va_start(
arg_ptr
); // (deprecated Pre-ANSI C89 standardization version)
注意,如果自定义参数和可变参数同时在函数中出现,为了不导致编译出错,将可变参数放在形参列表的最后一个位置。
void func(char parm_1, int parm_2, ...);
完整代码样例:
#include <stdio.h>
#include <stdarg.h>
void vout(int max, ...)
{
va_list arg_ptr;
int args = 0;
char* days[7];
va_start(arg_ptr, max);
while (args < max)
{
days[args] = va_arg(arg_ptr, char*);
printf("Day: %s \n", days[args++]);
}
va_end(arg_ptr);
}
int main(void)
{
vout(3, "Sat", "Sun", "Mon");
printf("\n");
vout(5, "Mon", "Tues", "Wed", "Thurs", "Fri");
}
运行结果:
Day: