2009-04-27 5 views
20

Ist das letzte Komma in einer C enum-Deklaration erforderlich?Ist das letzte Komma in C enum erforderlich?

d. H. Ist das Komma nach VAL3 erforderlich?

enum{Val1, Val2, Val3,} someEnum; 

es irgendwelche Nebenwirkungen davon in/out

Dank

+9

Im Standard C89 wurde das letzte Komma explizit verboten. In C99 erlauben sie es. Der Nebeneffekt des Zurücklassens ist, dass es nicht von strikten C89-Compilern kompiliert werden kann. –

Antwort

36

Es ist nicht erforderlich. Abschnitt 6.7.2.2 von C99 enthält die Syntax als:

enum-specifier: 
    enum identifieropt { enumerator-list } 
    enum identifieropt { enumerator-list , } 
    enum identifier 
enumerator-list: 
    enumerator 
    enumerator-list , enumerator 
enumerator: 
    enumeration-constant 
    enumeration-constant = constant-expression 

Hinweis Die ersten beiden Formen der enum-specifier, eine mit der Hinter Komma und eine ohne.

Ein Vorteil ich es mit gesehen habe, ist in Dinge wie:

enum { 
    Val1, 
    Val2, 
    Val3, 
} someEnum; 

wo, wenn Sie (zum Beispiel) hinzufügen in möchten Val4 und Val5 Sie einfach kopieren und fügen Sie den Val3 Linie ohne sich um die Anpassung von Kommas kümmern zu müssen.

Und, wie in einem Kommentar erwähnt, kann es auch sein, automatisierte Code-Generatoren zu vereinfachen, so dass sie keine spezielle Handhabung für den endgültigen Wert haben müssen. Sie können einfach jeden Wert ausgeben, gefolgt von einem Komma.

Dies kann auf den oft gesehen SQL verglichen werden:

select fld1, fld2 from tbl where 1=1 and fld1 > 8 

In diesem Fall ist die where 1=1 es nur so, dass Sie ein where vor dem ersten Satz und ein and nicht vor setzen müssen jeder nachfolgende. Sie können sich einfach darauf verlassen, dass die where schon da ist und verwenden Sie einfach and für alle die Sie hinzufügen.

Manche Leute denken vielleicht, das stinkt der Faulheit und sie haben recht, aber das ist nicht unbedingt eine schlechte Sache :-)

Jede anständige DBMS Abfrage-Optimierer sollte so konstant Klausel Streifen aus der Lage sein, bevor sie zu die Datenbanktabellen.

+8

Ein anderes Argument, das ich dafür gehört habe, ist maschinengenerierter Code - im Codegenerator wird ein weniger Eckfall benötigt. –

1

verlassen Nein, es ist nicht erforderlich und sollte für Code Klarheit weggelassen werden. Seine Anwesenheit/Abwesenheit hat keine Wirkung.

+2

Es wäre wesentlich präziser zu sagen, dass ein hinteres Komma keinen semantischen Wert hat. Seine Abwesenheit kann die Codepflege weniger komfortabel machen. Inwiefern macht das Fehlen eines abschließenden Kommas den Code klarer? –

+0

Wenn dem letzten Element des Enums sofort eine Klammer folgt, sieht es für mich klarer aus. Es ist subjektiv, nehme ich an. – sharptooth

3

Nein, es ist nicht erforderlich - in der Tat würde ich sagen, es hat einen schlechten Stil.

4

Nein, es ist nicht erforderlich. Der Grund dafür ist, dass es für den Zweck des Ausschneidens und Einfügens von Code einfacher ist, wenn Sie sich nicht darum kümmern müssen, ob das Komma da sein soll oder nicht.

3

Wie bereits erwähnt, ist es nicht erforderlich. Der Grund dafür, dass ein abschließendes Komma unterstützt wird, besteht darin, dass es (vorausgesetzt, dass die Elemente in einer Zeile angeordnet sind) die Reihenfolge der Elemente in einer Aufzählung mithilfe von Ausschneiden/Einfügen oder Ziehen/Ablegen neu anordnen kann das letzte Element auskommentieren, ohne einen Syntaxfehler zu erzeugen. Das Weglassen des nachfolgenden Kommas ist legal, verliert jedoch die Vorteile der Codepflege.

Ich hatte vergessen, aber Nick ist ganz richtig. Ich habe das abschließende Komma auch mit Compiler-Direktiven ausgenutzt. Ohne sie wäre der bedingte Code viel unordentlicher und schwerer zu lesen gewesen.

2

Es ist optional und nützlich, wenn Sie sagen, dass Sie Makro, z.

#ifdef _FLAG 
    #define OPTS opt_four, opt_five, 
#else 
    #define OPTS // none 
#endif 
enum { 
    opt_one, 
    opt_two, 
    opt_three, 
    OPTS 
}; 
0

Es ist nicht erforderlich, tatsächlich beschweren sich einige Compiler, wenn Sie einen hinzufügen. zum Beispiel Visual Studio 6.
Eine Verwendung für das Komma ist die Erstellung von enums mit c-Makros.

#define ELEMENT(x) x, 

enum MyElements { 
    ELEMENT(a) 
    ELEMENT(b) 
    ELEMENT(c) 
}; 

Dieses Muster ist nützlich, wenn Sie es gibt mehrere Dinge, die Sie mit den Elementen zu tun brauchen und wollen nur einmal definieren. Für ein vollständigeres Beispiel können Sie den Code des libiconv und das iconv-Dienstprogramm betrachten.

+0

Das ist schlecht. Warum nicht verwenden: "#define ELEMENT (x) x" und dann die Kommas in der Enumeration hinzufügen? – nilton

+1

Die Idee ist, dass der Inhalt des Enums selbst ein anderes Makro ist: '#define ALL_ELEMENTS (ELEMENT) ELEMENT (a) ELEMENT (b) ELEMENT (c)'. Sie definieren dann '# ELEMENT definieren 'zu dem, was Sie zu einem bestimmten Zeitpunkt benötigen, und rufen dann das Makro' ALL_ELEMENTS' auf. –

14

Wie alle anderen auch sagen, ist das Komma nicht erforderlich. Aber es ist neu in C99 (war in C89 nicht erlaubt) und wird auch in der nächsten Version von C++ erlaubt sein.

Ein weiterer Grund ist, einen Unterschied zwischen einem „Länge“ enumerator und einem normalen enumerator zu machen:

enum Items { 
    A, 
    B, 
    C, 
    LENGTH 
}; 

Jetzt können Sie Ihre Codierung Richtlinie setzen in, dass das letzte Element in Ihrer Aufzählung ein Komma haben sollte angewendet, aber nicht, wenn es ein "Length" -Element ist - was nur sagt, wie viele Elemente es gibt.

Es hilft auch für die automatische Generierung von Elementen (mit Makros/Präprozessoren) wie andere Antworten erklären.

+3

Es ist eine Schande, dass das LENGTH-Idiom die automatische Überprüfung der Vollständigkeit von switch (enum) durchbricht. –

7

Im Standard C89 ist das letzte Komma nicht erlaubt. Punkt.

Es war eine gemeinsame Erweiterung, um es zu erlauben; insbesondere wurde es vom GCC unterstützt, aber der Standard hat es ausdrücklich nicht anerkannt.

Im Standard C99 ist das letzte Komma für die Symmetrie mit Array- und Strukturinitialisierern erlaubt, die immer das abschließende Komma auf dem letzten Element zulassen.

6.7.2.2 Enumeration Bezeich

Syntax

enum-specifier: 
      enum identifieropt { enumerator-list } 
      enum identifieropt { enumerator-list , } 
      enum identifier 

Der primäre Vorteil von Hinter Komma ermöglicht ist, dass es einfache Maschinengeneration (C-Quelle) Code ermöglicht - Sie haben nicht um speziellen Fallcode für das letzte (oder vielleicht das erste) Element in der Liste der Initialisierer zu schreiben. Daher können Programme wie Yacc und Lex, um nur zwei zu nennen, etwas einfacher sein.

0

Andere Antworten erwähnen es, aber ich möchte nur hervorheben, dass das abschließende Komma in standardkonformen C89 und C++ nicht erlaubt ist, was es zu einem Portabilitätsproblem mit alten oder ungewöhnlichen Compilern macht. Hier ist ein nützlicher Link, der dieses und viele andere C/C++ - Probleme erklärt: http://david.tribble.com/text/cdiffs.htm#C99-enum-decl

1

Das letzte abschließende Komma ist nicht erforderlich.

ziehe ich Kommas aus zwei Gründen Hinter:

  1. reinigen git diffs.
  2. Einfache Bearbeitung in Editoren mit zeilenbasierten Befehlen (z. B. Vim dd).
Verwandte Themen