Perché una virgola in più non è consentita in un elenco di parametri quando è consentita nell'inizializzazione di parentesi graffe?

Perché una virgola in più non è consentita in un elenco di parametri quando è consentita nell'inizializzazione di parentesi graffe?


Facendo seguito a una mia vecchia domanda (c'è qualche rilevanza per un extra "," alla fine dell'inizializzazione di una parentesi?)


Ci sono ragioni tecniche per cui l'elenco dei parametri nelle dichiarazioni di funzione e nelle chiamate di funzione non è stato reso compatibile con la generazione di codice come l'inizializzazione delle parentesi graffe?


Quello che voglio dire è:


Va bene, l'extra , viene ignorato:


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

Per coerenza, non avrebbe senso consentire anche questo?


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

Non riesco a vedere come renderebbe la compilazione più complicata, ma forse c'è qualcosa a cui non sto pensando. Immagino che in realtà lo semplificherebbe leggermente.


Ovviamente si può obiettare che non è utile quanto l'inizializzazione delle parentesi, ma ci dovrebbero essere casi in cui la generazione del codice sarebbe resa almeno un pochino più semplice se ciò fosse consentito.


Risposte:


La giustificazione per le virgole finali negli elenchi di inizializzatori consiste nel consentire una facile generazione su macchina di grandi array statici. In questo modo, se ti capita di dover scrivere un programma che genera un elenco di inizializzatori di array C, puoi semplicemente scrivere qualcosa del genere:


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

Se la virgola finale non fosse consentita, dovresti assicurarti che non sia generata; e onestamente, anche se non è difficile da fare, è solo brutto e un dolore al collo.


Tuttavia, non è necessario generare automaticamente elenchi di parametri di funzione di grandi dimensioni e questi elenchi sembrano sicuramente più belli senza una virgola finale, quindi non è necessario consentire la stessa cosa nei parametri e nelle chiamate di funzione.