最近我发现了带有三个点参数的函数原型(prototype)。我编写了自己的函数并且编译得很好:
void func(int a, ...){}
这是什么意思?
更新
谢谢大家!我想到了。这是我的例子:
void func(unsigned int n_args, int arg, ...)
{
for(unsigned int i = 0; i < n_args; ++i)
cout << *((int*)&arg + i) << ' ';
}
此函数打印出由空格字符分隔的参数。
具有三个点的函数表示您可以传递可变数量的参数。由于被调用函数并不真正知道传递了多少参数,因此您通常需要某种方式来告知这一点。因此需要一些额外的参数,您可以使用这些参数来确定参数。
printf
就是一个很好的例子。您可以传递任意数量的参数,第一个参数是一个字符串,它描述了传入的额外参数。
void func(int count, ...)
{
va_list args;
int i;
int sum = 0;
va_start(args, count);
for(i = 0; i < count; i++)
sum += va_arg(args, int);
va_end(ap);
printf("%d\n", sum);
}
更新
要处理您的评论,您不需要参数的名称。这就是它的全部意义所在,因为在编译时您不知道将传递哪些参数和多少参数。这当然取决于功能。在我上面的示例中,我假设只有 int
被传递。正如您从 printf
中了解到的,您可以传递任何类型,并且您必须解释它们。这就是为什么您需要一个格式说明符来告诉函数传递的参数类型的原因。或者如我的示例所示,您当然可以假设一个特定类型并使用它。