为什么在大括号初始化中允许参数列表中不允许使用额外的逗号?

时间:2015-03-17 12:49:22

标签: c++ c code-generation

跟进我的一个老问题(Is there any relevance to an extra "," in the end of a brace initialization?

是否有任何技术原因导致函数声明和函数调用中的参数列表没有像大括号初始化一样对代码生成友好?

我的意思是:

没关系,额外的,会被忽略:

int generated_array[] = {
  1,
  2,
  3,
};

为了保持一致性,允许这样做是否也有意义?

int someFunc(
  int v1,
  int v2,
  int v3,
){...}

int ret_val = someFunc(
  1,
  2,
  3,
);

我看不出它会如何使编译变得更加复杂,但也许有些东西我没有想到。我猜它实际上会略微简化它。

当然,人们可以争辩说它没有大括号初始化那么有用,但是如果允许的话,应该有代码生成至少要简单一点的情况。

4 个答案:

答案 0 :(得分:5)

我们可以在Rationale for International Standard—Programming Languages—C 中的初始化列表中找到允许尾随逗号的基本原理,其中包含:

  

K& R允许在初始化程序结尾处使用尾随逗号   初始化列表。标准保留了这种语法,因为它   提供从初始化程序添加或删除成员的灵活性   列表,并简化了此类列表的机器生成。

此理由不适用于其他案件。

关于comp.lang.c++.moderatedAre comma-separated lists ending in a comma legal?的讨论也引用了同样的理由。

答案 1 :(得分:4)

在初始化列表中尾随逗号的理由是允许轻松生成大型静态数组的机器。这样,如果你碰巧需要编写一个生成C数组初始化列表的程序,你可以写这样的东西:

printf("int arr[] = {");
for (int i = 0; i < N; i++) {
    printf("%d, ", i);
}
printf("};");

如果不允许使用尾随逗号,则必须确保它不会生成;老实说,虽然做起来并不难,但它只是丑陋而且颈部疼痛。

虽然没有实际需要机器生成大型函数参数列表,并且这些列表在没有尾随逗号的情况下看起来更好,因此不需要在函数参数和调用中允许相同的内容。

答案 2 :(得分:0)

在我看来,这与以下事实有关:在C语言中,您可以在声明函数之前调用函数,或者使用空参数列表声明函数。在这种情况下,编译器从函数调用及其提供的参数中提取有关参数的信息。在这种情况下,尾随逗号可以被视为一个错误,即不清楚编写调用的程序员的意图,并且不清楚函数是否确实具有与参数数量相对应的参数数量。

当您使用初始化列表时,所有信息都在您眼前。您指定了多少个初始值设定项,因此初始化了很多项目,或者这么多元素都有一个数组。

答案 3 :(得分:0)

我似乎记得“很久以前在很远的星系中”,C语法允许使用尾随逗号来指定该函数具有可变数量的参数。后来它被改为, ...语法。

如果我错了,请纠正我。