【问题标题】:Why is the comma optional in C++ variadic function declarations?为什么 C++ 可变参数函数声明中的逗号是可选的?
【发布时间】:2011-11-25 21:54:48
【问题描述】:

这两个声明有区别吗?

int foo( int a, ... );

int foo( int a ... );

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

【问题讨论】:

  • 避免像 C++ 中的瘟疫一样的 varadic 函数。它破坏了强类型的精神。有很多理由不这样做,也有很多方法可以解决您认为需要它的任何问题。
  • 我确实避免使用它们,并且我同意这些建议。我很少使用它们,以至于我从未注意到这种语法上的怪异。看起来很奇怪。
  • 哇,即使没有逗号,它真的可以编译。
  • @EdHeal 你跑题了。您至少应该尝试回答实际问题,而不是简单地告诉他“不要那样做”。
  • @PaulManta:嗯,这就是为什么它被留下作为评论而不是答案。

标签: c++ syntax


【解决方案1】:

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

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

(我最初认为这可能与使参数包的语法更规则有关,但我发现无论如何它在 C++03 中都是明确允许的。)

【讨论】:

  • 如何使用void f(...)?没有参数名称就无法调用 va_start!
  • @WilliamPursell:它可以“使用”作为重载解决方案的后备,例如SFINAE 情况。
  • 在 C 中(至少在 C99 之前)void f(); 实际上等于 void (f...); 函数定义中的空参数列表意味着函数可以接受“任意”数量的参数,而函数声明中的空参数列表意味着该函数不接受任何参数。
  • @CharlesBailey 你是对的,我的意思是函数声明中的空参数列表意味着参数的数量未知,而函数定义中的空参数列表意味着函数不接受任何参数。
  • @TommyA:旧式函数声明和定义在 C99 C11 中仍然是合法的(但“已过时”)。但是void f(); 不等于void f(...);。前者指定了一个固定但未知数量和类型的参数;后者(如果没有至少一个显式参数是合法的)将允许不同的调用传递不同数量和类型的参数。
猜你喜欢
  • 2016-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-25
  • 2017-12-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多