奇怪的编译输出

时间:2012-08-26 18:56:55

标签: c++ c gcc

我刚刚编译了这段代码:

void foo(int bar...) {}

int main()
{
   foo(0, 1);
   return 0;
}

编译输出真的很奇怪:

  

g ++ test.c

输出:

  

没有

  

gcc test.c

输出:

  

test.c:1:17:错误:预期';',','或')'在'...'令牌之前

我知道参数之后没有逗号,这个问题关于奇怪的编译输出。

我理解为什么这在C中无效,但无法理解为什么它在C ++中有效。

4 个答案:

答案 0 :(得分:11)

另一个答案是正确的(我赞成),但只是提供参考[8.3.5功能第3条]:

  

parameter-declaration-clause:

     

参数声明列表 <子>选择 ... <子>选择

     

parameter-declaration-list,...

这意味着逗号在C ++中是可选,但不在C中。您也可以在C ++中编写void foo(...),因为参数声明列表也是可选的。

至于为什么在C ++模板中,test(...)在使用SFINAE作为“全能”功能时很常见。但是,在C中,foo(...)没有使用,因此它是非法的。

答案 1 :(得分:7)

事情是C ++允许

returntype funcname(optional_param...)
可变参数函数的

语法,而C不是。

答案 2 :(得分:4)

你只是偶然发现了C和C ++语言语法之间的模糊差异。是的,C ++允许你的语法,而C不允许。在C ++中,...之前的逗号是可选的,而在C中,它始终是必需的。这就是它的全部内容。

答案 3 :(得分:0)

C ++中不允许使用逗号版本来允许f(...)为什么?

考虑     void f(){} 在C中,这意味着“我接受任何东西”,在C ++中,这意味着“我什么都不接受”。 (void f(void)是C中的“我什么都不接受”

为了在C ++中声明C“我接受任何东西”功能,你必须写     extern“C”void f(...);