“...”是英文中的
省略号、
运算符,可以当作省略符号使用,在
网络用语中可表示无奈或无语,在
c语言中可代表声明
可变参数函数或定义可变参数函数。
用法
运算符
C语言中
可变参数函数(Variadic functions)是
stdarg.h内容典型的应用,虽然也可以使用在其由可变参数函数调用的函数(例如,
vprintf)。
声明可变参数函数
可变参数函数的参数数量是可变动的,它使用省略号来忽略之后的参数。例如
printf函数一般。
代表性的声明为:
int check(int a, double b, ...);
可变参数函数最少要有一个命名的参数,所以
char *wrong(...);
在C中是不被允许的(在C++中,这样的声明是合理的)。C中,省略符号之前必须要有逗号;而在C++中,则没有这种强制要求。
定义可变参数函数
使用相同的语法来定义:
访问未命名的参数,首先必须在可变参数函数中声明
va_list类型的变量。调用
va_start并传入两个参数:第一个参数为va_list类型的变量,第二个为省略号前最后一个有名字的参数的名称,接着每一调用
va_arg就会返回下一个参数,va_arg的第一个参数为va_list,第二个参数为返回的类型。最后
va_end必须在函数返回前被va_list调用(va_list当作参数)(没有要求要读取完所有参数)。
C99提供额外的宏,va_copy,它能够复制va_list。而va_copy(va2, va1)函数作用为拷贝va1到va2。
没有机制定义该怎么判别传递到函数的参数量或者
数据类型。函数通常需要知道或确定它们变化的方法。共通的惯例包含:
使用
printf或
scanf类的格式化
字串来嵌入明确指定的类型。
在可变参数最后的标记值(sentinel value)。
总数变量来指明可变参数的数量。
C++中
C++11中
可变参数模板让您能创建则样的模板函数或
模板类,即接受可变数量的参数。
声明方法: template Types> //...
例如:
Java中
在编写一个方法时,其参数随着程序运行的条件而变化,在编译期间无法确定。具体地讲,例如编写一个打印参加聚会party的程序,其中方法printInvitation()将根据作为参数的参加人姓名,打印邀请卡。但这个参数的数量事先并不确定。当然可以编写许多重载的方法来解决这个问题,如:
void printInvitation(String name);
void printInvitation(String name1, Stringname2);
void printInvitation(String name1, Stringname2, String name3);
问题是编写多少个重载的方法才可以解决给所有参加者打印邀请卡.也许需要改变您的程序设计,而使用数组或者链接表了。
应用可变参数可以方便、灵活地解决这类问题。例如:
void printInvitation(String...names)
for (String name : names)
(makeCard(name)); //调用方法按照姓名打印邀请卡
这里,(String...names)便是可变参数。该参数包括从0到任意个相同类型的参数。在编译期间,这个可变参数将被转换为
字符串数组形式,即:void printInvitation(String names).
如下是调用这个方法的例子:
printInvitation(); //无参数
当在无参数情况下调用这个方法时,将不执行任何这个方法中的
代码。
如下是运行结果:
Recording info: invitation card has been printed for 李刚
Recording info: invitation card has been printed for David Smith
Recording info: invitation card has been printed for Greg Wu
Recording info: invitation card has been printed for Paul Nguyen
Recording info: invitation card has been printed for Liu Wei
Recording info: invitation card has been printed for 张新