我刚刚编译了这段代码:
void foo(int bar...) {}
int main()
{
foo(0, 1);
return 0;
}
编译输出真的很奇怪:
g ++ test.c
输出:
没有
和
gcc test.c
输出:
test.c:1:17:错误:预期';',','或')'在'...'令牌之前
我知道参数之后没有逗号,这个问题关于奇怪的编译输出。
我理解为什么这在C中无效,但无法理解为什么它在C ++中有效。
答案 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(...);