2015-03-17 8 views
8

Im Anschluss an einer alten Frage von mir (Is there any relevance to an extra "," in the end of a brace initialization?)Warum ist ein zusätzliches Komma in einer Parameterliste nicht erlaubt, wenn es in einer Klammerinitialisierung zulässig ist?

Gibt es technische Gründe, warum die Parameterliste in Funktionsdeklarationen und Funktionsaufrufen ist wie die Klammer Initialisierung nicht aus Code-Generation freundlich?

Was ich meine ist:

Das ist in Ordnung, die zusätzlichen , wird ignoriert:

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

Aus Gründen der Einheitlichkeit würde es nicht auch Sinn machen, um dies zu ermöglichen?

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

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

Ich kann nicht sehen, wie es Kompilierung komplizierter machen würde, aber vielleicht gibt es etwas, an das ich nicht denke. Ich würde vermuten, es würde es tatsächlich ein wenig vereinfachen.

Natürlich kann man argumentieren, dass es nicht so nützlich wie die Klammerinitialisierung ist, aber es sollte Fälle geben, in denen die Codeerzeugung zumindest ein kleines bisschen einfacher wäre, wenn dies erlaubt wäre.

+1

** Syntaxregel! ** – haccks

+8

Die Argumentation für nachgestellte Kommas in Initialisierungslisten dient der einfachen maschinellen Generierung großer statischer Arrays. Es gibt jedoch keine praktische Notwendigkeit, große Funktionsparameterlisten maschinell zu erzeugen. –

+0

Sobald wir dorthin gehen, müssen wir 'int a, b = 1, c = 6,;' aus Gründen der Konsistenz zulassen. – cleong

Antwort

4

Die Argumentation für nachfolgende Kommas in Initialisierungslisten dient der einfachen maschinellen Generierung großer statischer Arrays. Auf diese Weise, wenn Sie ein Programm schreiben, passieren zu müssen, die eine C-Array Initialisiererliste generiert, können Sie nur so etwas schreiben:

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

Wenn das Komma nicht erlaubt war, würden Sie sicher machen müssen dass es nicht generiert wird; und ehrlich gesagt, obwohl es nicht schwer zu tun ist, ist es nur hässlich und ein Schmerz im Nacken.

Es gibt keine praktische Notwendigkeit, große Funktionsparameterlisten maschinell zu erzeugen, und diese Listen sehen zwar ohne ein nachkommendes Komma schöner aus, so dass das Gleiche in Funktionsparametern und Aufrufen nicht zugelassen werden muss.

+0

Ich sehe nicht, warum die Liste groß sein muss, damit dies ein nettes Feature aus Sicht der Code-Generierung ist. Der Punkt ist, dass es eine variable Größe hat. – Martin

+0

@Martin es muss nicht groß sein, es ist nur typisch. –

5

Wir haben die Gründe dafür, dass das folgende Komma in einer Initialisierer-Liste im Rationale for International Standard—Programming Languages—C finden, die sagt:

K & R ein Komma in einem initializer ermöglicht am Ende eines initializer -Liste. Der Standard hat diese Syntax beibehalten, da er Flexibilität beim Hinzufügen oder Löschen von Elementen aus einer Initialisierungsliste bietet und die maschinelle Erstellung solcher Listen vereinfacht.

Diese Begründung gilt nicht für die anderen Fälle. Diese Diskussion auf comp.lang.c++.moderated: Are comma-separated lists ending in a comma legal? zitiert auch die gleiche Begründung.

0

Meiner Ansicht nach hängt dies damit zusammen, dass man früh in C Funktionen aufrufen konnte, bevor ihre Deklarationen oder Funktionen mit einer leeren Parameterliste deklariert wurden. In diesem Fall extrahiert der Compiler die Informationen über Parameter von einem Funktionsaufruf und seinen gelieferten Argumenten. In diesem Fall kann das nachgestellte Komma als ein Fehler angesehen werden, bei dem die Absicht des Programmierers, der den Aufruf geschrieben hat, unklar war und es nicht klar war, ob die Funktion tatsächlich die Anzahl von Parametern hat, die der Anzahl von Argumenten entspricht.

Wenn Sie eine Initialisierungsliste verwenden, sind alle Informationen vor Ihren Augen. Wie viele Initialisierer Sie so viele Elemente initialisiert haben oder so viele Elemente haben ein Array.

0

Ich erinnere mich, dass "vor langer Zeit in einer Galaxie weit weg", C-Syntax erlaubt nachlaufende Komma für die Angabe dieser Funktion hat eine variable Anzahl von Parametern. Später wurde es in , ... Syntax geändert.

Korrigieren Sie mich, wenn ich falsch liege.

+0

Meine Güte, es muss _very_ vor langer Zeit sein, wenn ich noch nie davon gehört habe. Länger als zum Beispiel bedeutet "= +" dasselbe wie "+ =". – TonyK

Verwandte Themen