2013-03-27 90 views
1

我回答了这个问题How can I get my va_list arguments to repeat itself?,发现了罕见的函数声明:这是什么声明`void func(bool b ...)`?

void ordered(int num1, double list ...); 

起初我以为,编译器会抱怨,但铿锵3.2没有我也没有G ++ 4.7.2。

这个声明是什么扩展到?什么它被解释?

编辑:我知道省略号。但正常的形式是<return type> <function-name>(<argument1-type> <arg-name>, ...);在例子中缺少逗号。

+0

这种让我想起http://stackoverflow.com/questions/5625600/what-is-the-meaning-of-token – chris 2013-03-27 13:57:46

回答

3

这是一样的:

void ordered(int num1, double list, ...); 
+0

的,我想这该声明不与'va_arg'工作?我的测试至少表明他们没有。 – RedX 2013-03-27 13:47:15

+0

@RedX,它应该和任何其他C可变参数一样工作。 – chris 2013-03-27 13:49:50

+0

是的,我的测试用例是错误的:) – RedX 2013-03-27 14:09:17

1

的三个点(...)被称为“椭圆”,并表示一个变量参数列表。所以你可以传递尽可能多的参数(虽然有一个操作系统指定的限制)。例如,以这种方式,printf工作。

请参阅here作进一步说明。

1

我想你的意思是“...”吧?

对于某些函数,不可能指定调用中期望的所有参数的数量和类型。通过使用省略号(...)终止参数声明列表来声明这样的函数。

3

这是C++标准语法的一个片段:

parameter-declaration-clause: 
    parameter-declaration-list[opt] ...[opt] 
    parameter-declaration-list , ... 

基本上省略号可以通过,如果是其他参数声明之前,但它不必是。函数声明:

void f(int,double...); 

真正含义是:

void f(int,double,...); 
+0

有趣,在这种情况下不知道逗号是可选的。谢谢。 – RedX 2013-03-27 13:48:24

+0

+1击败我:) – 2013-03-27 13:48:57

2
void ordered(int num1, double list ...); 

是相同:

void ordered(int num1, double list, ...); 

参考:
标准C++ 11 8.3.5.3/4 :

parameter-declaration-clause: 
parameter-declaration-listopt ...opt 
parameter-declaration-list , ... 

如果parameter-declaration-clause终止与省略号或函数参数包(14.5.3),参数的数目应大于不具有默认参数,并且参数的数目等于或大于不是功能参数包。在句法上正确且其中“...”不是abstract-declarator的一部分时,“, ...”“...”是同义的。