为什么在大括号初始化中允许在参数列表中使用额外的逗号?
Why is an extra comma not allowed in a parameter list when it is allowed in a brace initialization?
跟进我的一个老问题 (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,
);
我看不出它会如何使编译变得更复杂,但也许有些事情我没有想到。我猜它实际上会稍微简化它。
当然有人会说它不如大括号初始化有用,但如果允许的话,在某些情况下代码生成至少会简单一点。
初始化列表中尾随逗号的理由是允许机器轻松生成大型静态数组。这样,如果你碰巧需要编写一个生成 C 数组初始化列表的程序,你可以这样写:
printf("int arr[] = {");
for (int i = 0; i < N; i++) {
printf("%d, ", i);
}
printf("};");
如果不允许使用尾随逗号,则必须确保不生成它;老实说,虽然做起来并不难,但很难看,而且脖子疼。
虽然没有实际需要机器生成大型函数参数列表,而且这些列表确实没有尾随逗号看起来更好,因此不需要在函数参数和调用中允许相同的事情。
我们可以找到在 Rationale for International Standard—Programming Languages—C 中的 initializer-list 中允许尾随逗号的理由:
K&R allows a trailing comma in an initializer at the end of an
initializer-list. The Standard has retained this syntax, since it
provides flexibility in adding or deleting members from an initializer
list, and simplifies machine generation of such lists.
此理由不适用于其他情况。
关于 comp.lang.c++.moderated
的讨论:Are comma-separated lists ending in a comma legal? 也引用了相同的理由。
在我看来,这与以下事实有关:在 C 的早期,您可以在函数声明之前调用函数,或者使用空参数列表声明函数。在这种情况下,编译器从函数调用及其提供的参数中提取有关参数的信息。在这种情况下,尾随逗号可以被认为是一个错误,因为不清楚编写调用的程序员的意图,也不清楚函数是否确实具有与参数数量相对应的参数数量。
当您使用初始化列表时,所有信息都在您眼前。您指定了多少个初始值设定项如此多的项目被初始化或如此多的元素将有一个数组。
我好像记得 "a long time ago in a galaxy far away",C 语法允许尾随逗号来指定该函数具有可变数量的参数。后来改为, ...
语法。
如有错误请指正
跟进我的一个老问题 (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,
);
我看不出它会如何使编译变得更复杂,但也许有些事情我没有想到。我猜它实际上会稍微简化它。
当然有人会说它不如大括号初始化有用,但如果允许的话,在某些情况下代码生成至少会简单一点。
初始化列表中尾随逗号的理由是允许机器轻松生成大型静态数组。这样,如果你碰巧需要编写一个生成 C 数组初始化列表的程序,你可以这样写:
printf("int arr[] = {");
for (int i = 0; i < N; i++) {
printf("%d, ", i);
}
printf("};");
如果不允许使用尾随逗号,则必须确保不生成它;老实说,虽然做起来并不难,但很难看,而且脖子疼。
虽然没有实际需要机器生成大型函数参数列表,而且这些列表确实没有尾随逗号看起来更好,因此不需要在函数参数和调用中允许相同的事情。
我们可以找到在 Rationale for International Standard—Programming Languages—C 中的 initializer-list 中允许尾随逗号的理由:
K&R allows a trailing comma in an initializer at the end of an initializer-list. The Standard has retained this syntax, since it provides flexibility in adding or deleting members from an initializer list, and simplifies machine generation of such lists.
此理由不适用于其他情况。
关于 comp.lang.c++.moderated
的讨论:Are comma-separated lists ending in a comma legal? 也引用了相同的理由。
在我看来,这与以下事实有关:在 C 的早期,您可以在函数声明之前调用函数,或者使用空参数列表声明函数。在这种情况下,编译器从函数调用及其提供的参数中提取有关参数的信息。在这种情况下,尾随逗号可以被认为是一个错误,因为不清楚编写调用的程序员的意图,也不清楚函数是否确实具有与参数数量相对应的参数数量。
当您使用初始化列表时,所有信息都在您眼前。您指定了多少个初始值设定项如此多的项目被初始化或如此多的元素将有一个数组。
我好像记得 "a long time ago in a galaxy far away",C 语法允许尾随逗号来指定该函数具有可变数量的参数。后来改为, ...
语法。
如有错误请指正