我刚刚编译了这段代码:
void foo(int bar...) {}
int main()
{
foo(0, 1);
return 0;
}
编译输出真的很奇怪:
g++ test.c
输出:
没有
和
gcc 测试.c
输出:
test.c:1:17: 错误:在 '...' 标记之前需要 ';'、',' 或 ')'
我知道参数后面没有逗号,这个关于奇怪编译输出的问题。
我理解为什么这在 C 中无效,但不明白为什么它在 C++ 中有效。
另一个答案是正确的(我赞成),但只是为了提供参考[8.3.5 Functions Clause 3]:
参数声明子句:
参数声明列表opt ... opt
参数声明列表,...
这意味着逗号在 C++ 中是可选的,但在 C 中不是。你也可以用void foo(...)
C++ 编写,因为参数声明列表也是可选的。
至于为什么在 C++ 模板中test(...)
使用 SFINAE 来实现“包罗万象”的功能很常见。但是,在 C 中,没有使用 for foo(...)
,因此它是非法的。
问题是 C++ 允许
returntype funcname(optional_param...)
可变参数函数的语法,而 C 没有。
您只是偶然发现了 C 和 C++ 语言语法之间的模糊差异。是的,C++ 允许你的语法,而 C 不允许。在 C++ 中,逗号之前...
是可选的,而在 C 中,它始终是必需的。这里的所有都是它的。
C++ 中不允许逗号版本允许 f(...) 为什么?
考虑 void f() {} 在 C 中这意味着“我接受任何东西”,而在 C++ 中这意味着“我什么都不接受”。( void f(void) 在 C 中是“我什么都不接受”)
为了在 C++ 中声明 C“我接受任何东西”函数,您必须编写 extern "C" void f(...);