Vermeiden Sie Kollisionen mit Namen, die mit enum in C (C99)
enum
Elemente " Namen sind anfällig für überschneidungen/kollidieren mit den beiden anderen enum-Elemente-Namen, Variablen-Namen, etc...
enum Fruit
{
apple,
orange
};
typedef enum Fruit Fruit;
enum Color
{
red,
orange //<-- ERROR
};
typedef enum Color Color;
char apple='a'; //<-- ERROR
Gibt es eine C99-konforme Lösung, um zu vermeiden Kollision anderen als Präfix jedem enum-element einen Namen?
Seite Hinweis: hat diese Frage bereits eine Antwort für C++
Wie, um Namenskonflikte zu vermeiden für zwei enum-Werte mit dem gleichen Namen in C++?
Ich bin auf der Suche nach C99-Lösung.
Ja, verwenden Sie einen passenden Namen wie
Gibt es eine [...] Lösung andere als ein Präfix jedes enum element name ?
Vielleicht, aber es wäre wahrscheinlich eine schlechte Lösung, das ist eine gute Lösung, die hilft, die Lesbarkeit zu.
gibt es etwas, das besser lesbar ist als
Ja
color_orange
und fruit_orange
. Es sollten auch vermeiden, die Verwirrung beim Lesen.Gibt es eine [...] Lösung andere als ein Präfix jedes enum element name ?
Vielleicht, aber es wäre wahrscheinlich eine schlechte Lösung, das ist eine gute Lösung, die hilft, die Lesbarkeit zu.
gibt es etwas, das besser lesbar ist als
Fruit f = orange;
und Color c = orange;
? Es ist ordentlich und ohne Zweifel als f
ist ein Obst-und c
eine FarbeJa
Fruit fruit = FruitOrange;
. Ach ja, und in diesem Fall switch (fruit) {case FruitOrange: break ...}
. Wenn es viele Früchte, die Sie gerne Präfix. Auch f
werden kann, für file
, f**ck
, und viele andere wrods, die beginnen mit f
fruit
statt einfach fruit
.InformationsquelleAutor Paolo | 2016-02-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
In C gibt es keine andere Lösung als Präfix den Namen der enum-Werte.
Wie schon in den OP, C++ hat eine Reihe von Mechanismen, von denen
enum class
ist wahrscheinlich indiziert zur moderne-code. In der Praxis ist jedoch das Ergebnis ist das gleiche: Sie enden, indem der name des enum-element mit dem Namen der enum. WohlFruit::orange
ist aufgeräumter alsFruitOrange
, aber wirklich, es macht wenig Unterschied in meinen Augen.In einigen parallel-Universum, es wäre toll, haben eine Sprache, in der Sie schreiben konnte:
haben und der compiler ableiten, der dem Namensraum die Konstante auf der rechten Seite. Aber ich sehen nicht, wie die Sprache C. C keine namespaces in diesem Sinne, und selbst wenn es Tat, die Art system erlaubt nur die conversions, Sie ist nicht Bedingung, die die syntax der RHS von einem Betreiber auf der Grundlage der LHS (und ich benutze das Wort syntax absichtlich, weil name lookup ist eine syntaktische Eigenschaft, die in C).
Selbst wenn Sie haben einige Sprache hack, die manchmal implictly eingefügt enum namespace, müssen Sie dennoch die explizite Präfix auf einen Vergleich, weil
keinen Kontext, in dem der Abzug erfolgen konnte, obwohl die Tatsache, dass enum-Werte in C sind alle vom Typ
int
machtFruitApple
undFruitOrange
vergleichbar.InformationsquelleAutor rici