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

跟进我的一个老问题( 在大括号初始化结束时是否与额外的“,”相关? )

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

我的意思是:

这没关系,额外的,被忽略了:

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

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

 int someFunc( int v1, int v2, int v3, ){...} int ret_val = someFunc( 1, 2, 3, ); 

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

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

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

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

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

但是,没有实际需要机器生成大型函数参数列表,并且这些列表无需使用尾随逗号就可以看起来更好,因此不需要在函数参数和调用中允许相同的内容。

我们可以找到在国际标准编程语言的基本原理 – C中的初始化列表中允许尾随逗号的基本原理,其中说:

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

该理由不适用于其他情况。

关于comp.lang.c++.moderated讨论的讨论: 逗号分隔的列表以逗号合法结尾吗? 也引用了同样的理由。

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

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

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

如我错了请纠正我。