¿Por qué no se permite una coma adicional en una lista de parámetros cuando se permite en una inicialización de llaves?

¿Por qué no se permite una coma adicional en una lista de parámetros cuando se permite en una inicialización de llaves?


Continuando con una vieja pregunta mía (¿Hay alguna relevancia para un "," adicional al final de una inicialización de llaves?)


¿Hay alguna razón técnica por la que la lista de parámetros en las declaraciones de funciones y las llamadas a funciones no se ha hecho compatible con la generación de código como la inicialización de llaves?


Lo que quiero decir es:


Esto está bien, el extra , se ignora:


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

Por consistencia, ¿no tendría sentido permitir esto?


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

No puedo ver cómo haría que la compilación sea más complicada, pero tal vez hay algo en lo que no estoy pensando. Supongo que en realidad lo simplificaría un poco.


Por supuesto, se puede argumentar que no es tan útil como la inicialización con llaves, pero debería haber casos en los que la generación de código se simplificaría al menos un poco si se permitiera.


Respuestas:


La justificación de las comas finales en las listas de inicializadores es permitir una fácil generación automática de grandes matrices estáticas. De esta manera, si necesita escribir un programa que genere una lista de inicializadores de matriz C, puede escribir algo como esto:


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

Si no se permite la coma final, debe asegurarse de que no se genere; y, sinceramente, aunque no es difícil de hacer, es feo y doloroso.


Sin embargo, no hay una necesidad práctica de generar grandes listas de parámetros de función por máquina, y estas listas ciertamente se ven mejor sin una coma al final, por lo que no hay necesidad de permitir lo mismo en los parámetros y llamadas de funciones.