为什么逗号在 C++ 可变参数函数声明中是可选的?

Why is the comma optional in C++ variadic function declarations?

提问人:William Pursell 提问时间:11/26/2011 最后编辑:William Pursell 更新时间:11/26/2011 访问量:453

问:

这两个声明有区别吗?

int foo( int a, ... );

int foo( int a ... );

如果没有区别,那么使第二个句法有效的意义何在?

C++ 语法

评论

11赞 Ed Heal 11/26/2011
避免像 C++ 中的瘟疫那样的流浪函数。它破坏了强打字的精神。有很多理由不这样做,也有很多方法可以解决您认为需要它的任何问题。
0赞 William Pursell 11/26/2011
我确实避免了它们,我同意这个建议。我很少使用它们,以至于我从未注意到这种句法上的奇怪之处。这似乎很奇怪。
1赞 ScarletAmaranth 11/26/2011
哇,即使没有逗号,它也能编译。
3赞 Paul Manta 11/26/2011
@EdHeal 你跑题了。你至少应该试着回答实际的问题,而不是简单地告诉他“不要那样做”。
9赞 Ed S. 11/26/2011
@PaulManta:嗯,这就是为什么它被作为评论而不是答案留下的原因。

答:

2赞 CB Bailey 11/26/2011 #1

这是推测,但在 C++ 中,有一个没有其他参数的函数是有意义的,例如 而在 C 中,这样的函数没有用处(据我所知),因此必须遵循其他一些参数,因此需要逗号。void f(...)...

从语法的角度来看,简单地允许并赋予它明显的含义比不允许它更简单,而且它不会给编译器编写者带来太大的负担,也不会给程序员带来任何困惑。void f( int a ... )

(我最初认为这可能与使参数包的语法更规则有关,但我发现在任何情况下,C++03 中都明确允许这样做。

评论

0赞 William Pursell 11/26/2011
如何使用 void f(...)?没有参数名称就无法调用va_start!
2赞 CB Bailey 11/26/2011
@WilliamPursell:它可以“用于”过载解决的回退,例如 SFINAE 情况。
1赞 Tommy Andersen 11/26/2011
在 C 中(至少在 C99 之前)实际上等于 函数定义中的空参数列表意味着函数可以接受“任意”数量的参数,而函数声明中的空参数列表意味着函数不接受任何参数。void f();void (f...);
0赞 Tommy Andersen 11/26/2011
@CharlesBailey你是对的,我的意思是函数声明中的空参数列表意味着参数的数量是未知的,而函数定义中的空参数列表意味着函数不带参数。
0赞 Keith Thompson 8/27/2012
@TommyA:旧式的函数声明和定义在 C99 C11 中仍然是合法的(但“过时”)。但并不等同于 .前者指定一个固定但未知的参数数量和类型;后者(如果它是合法的,没有至少一个显式参数)将允许不同的调用传递不同数量和类型的参数。void f();void f(...);