11

我刚刚编译了这段代码:

void foo(int bar...) {}

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

编译输出真的很奇怪:

g++ test.c

输出:

没有

gcc 测试.c

输出:

test.c:1:17: 错误:在 '...' 标记之前需要 ';'、',' 或 ')'

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

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

4

4 回答 4

11

另一个答案是正确的(我赞成),但只是为了提供参考[8.3.5 Functions Clause 3]:

参数声明子句:

参数声明列表opt ... opt

参数声明列表,...

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

至于为什么在 C++ 模板中test(...)使用 SFINAE 来实现“包罗万象”的功能很常见。但是,在 C 中,没有使用 for foo(...),因此它是非法的。

于 2012-08-26T19:25:00.817 回答
7

问题是 C++ 允许

returntype funcname(optional_param...)

可变参数函数的语法,而 C 没有。

于 2012-08-26T18:58:56.183 回答
4

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

于 2012-08-26T19:34:24.953 回答
0

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

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

为了在 C++ 中声明 C“我接受任何东西”函数,您必须编写 extern "C" void f(...);

于 2012-08-26T23:06:17.773 回答