Nachgestellte Kommas und C++

Lesezeit: 3 Minuten

Benutzeravatar von Lockhead
Lockhead

Ich habe irgendwo gelesen, dass der C++-Standard so etwas nicht zulässt enum an_enum { a, b, c, };, während spätere Versionen von C (ich glaube ab Mitte der 90er Jahre) solche Deklarationen mit nachgestellten Kommas zulassen. Wenn C++ Abwärtskompatibilität mit C haben soll, warum ist diese Funktion dann verboten? Irgendein besonderer Grund?

Ich habe auch gelesen, dass solche nachgestellten Kommas eigentlich gut sind, was nur zur Verwirrung beiträgt.

  • Nachgestellte Kommas sind gut für den faulen Programmierer. Und Faulheit ist gut 🙂

    – pmg

    16. Juni 2011 um 13:39 Uhr


  • Nachgestellte Kommas sind besonders gut, wenn Sie einen Wert pro Zeile haben, da es alle Zeilen ähnlich macht, sehr nützlich für computer- (oder makro-) generierte Werte.

    – chqrlie

    31. Januar 2017 um 8:03 Uhr

  • Leicht zu generierender Code durch Drucken a, b, c, in einer for-Schleife, ohne den letzten Fall wie in irgendwie separat behandeln zu müssen a, b, c.

    – Olli Niemitalo

    1. Juni 2019 um 3:49 Uhr


  • Auch besser für Diffs auf mehrzeiligen Listen. ZB ein einzeiliger Unterschied, wenn Sie einen Wert zur Liste hinzufügen oder daraus entfernen.

    – CodeMonkey

    25. Juni 2020 um 16:11 Uhr


Benutzeravatar von Steve Jessop
Steve Jessop

C++03 (ein relativ kleines Update von C++98) basiert seine C-Kompatibilität auf C89 (auch bekannt als C90, je nachdem, ob Sie ANSI oder ISO sind). C89 erlaubt kein abschließendes Komma. C99 erlaubt es. C++11 erlaubt es (7.2/1 hat die Grammatik für eine Enum-Deklaration).

Tatsächlich ist C++ nicht einmal mit C89 vollständig abwärtskompatibel, obwohl Sie erwarten würden, dass C++ dies zulässt, wenn es in C89 enthalten wäre.

Der Hauptvorteil des abschließenden Kommas ist für mich, wenn Sie Folgendes schreiben:

enum Channel {
    RED,
    GREEN,
    BLUE,
};

und dann später so ändern:

enum Channel {
    RED,
    GREEN,
    BLUE,
    ALPHA,
};

Schön ist, dass bei dir nur eine Zeile geändert wird diff die Versionen. Um den gleichen Effekt zu erzielen, wenn kein nachgestelltes Komma erlaubt ist, könnten Sie schreiben:

enum Channel {
    RED
   ,GREEN
   ,BLUE
};

Aber (a) das ist Schwachsinn, und (b) es hilft nicht in dem (zugegebenermaßen seltenen) Fall, dass Sie den neuen Wert am Anfang hinzufügen möchten.

  • Es gibt eine Denkschule, die besagt: Wenn Sie mit einem zweizeiligen Diff nicht so einfach umgehen können wie mit einem einzeiligen Diff, haben Sie nichts mit Diffs zu tun 🙂

    – paxdiablo

    31. Januar 2017 um 7:19 Uhr

  • Ich verwende die “crazy talk”-Version, aber mit dem Komma am Anfang der Zeile und dann dem Tabulator. Es verursacht mehrzeilige Unterschiede, wenn Sie am Anfang einen neuen Wert hinzufügen, aber das ist relativ selten.

    – MM

    31. Januar 2017 um 7:33 Uhr

  • ,GREEN sieht aus wie ein Lisp-Makro-Ersatz… 😉

    – chqrlie

    31. Januar 2017 um 8:06 Uhr


  • Leider unterstützt C++ dies für Struct/Class-Initialisiererlisten foo = {a,b,c,} und Aufzählungen enum {a,b,c,}aber nicht einmal C++20 unterstützt es noch für Initialisierungslisten von Klassenmitgliedern Foo() : a(42), b(13), c(3.14), {}. Die Sprache ist also nicht so sauber unterscheidbar wie sie könnte sein.

    – Dwayne Robinson

    11. Mai 2021 um 1:13 Uhr


Wenn Sie sich den neuesten Entwurf für C ++ 0x ansehen, sieht es so aus, als könnten Sie nachgestellte Kommas verwenden:

enum-specifier:
enum-head { enumerator-list opt}
enum-head { enumerator-list , }

enumerator-list:
enumerator-definition
enumerator-list , enumerator-definition

Zum einen war der letzte C-Standard 1999. Der letzte (vollständige) C++-Standard war 98 (2003 war ein Update). Danach geht nicht alles von C99 in C++11.

Benutzeravatar von Lundin
Lundin

Nachgestelltes Komma in Enum wurde in C99 als Feature eingeführt. Es existiert nicht in C90- oder C++-Versionen, die auf einer Pre-C99-Baseline basierten.

1393450cookie-checkNachgestellte Kommas und C++

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy