Éviter les collisions de noms avec enum en C (C99)
enum
éléments les noms sont sensibles à des doublons et entrent en collision avec deux autres enum éléments les noms, les noms de variables, etc...
enum Fruit
{
apple,
orange
};
typedef enum Fruit Fruit;
enum Color
{
red,
orange //<-- ERROR
};
typedef enum Color Color;
char apple='a'; //<-- ERROR
Est-il un C99 solution conforme à éviter la collision autres que de préfixer chaque enum nom de l'élément?
Note de côté: cette question a déjà une réponse pour le C++
Comment éviter les conflits de nom pour deux valeurs enum avec le même nom en C++?
Je suis à la recherche d'un C99 solution.
- Oui, utiliser un nom approprié comme
color_orange
etfruit_orange
. Il faut également éviter la confusion lors de la lecture. - Est-il [...] la solution de autres que de préfixer chaque enum nom de l'élément ?
- Peut-être, mais ce serait probablement une mauvaise solution, c'est une bonne solution qui permet de lisibilité trop.
- est-il rien de mieux lisible que
Fruit f = orange;
etColor c = orange;
? C'est bien rangé et sans doute quef
est un fruit etc
une couleur - Oui
Fruit fruit = FruitOrange;
. Oh, et dans ce casswitch (fruit) {case FruitOrange: break ...}
. Si il ya beaucoup de fruits, vous serez heureux de les préfixer. Aussif
peut être pourfile
,f**ck
, et de nombreux autres wrods qui commencent parf
fruit
, au contraire, est tout simplementfruit
. - c'est laid! 🙂 mais bien sûr, si c'est la seule solution que je vais aller avec ça. "Il n'y a pas de solution pour que" (si vrai) peut être une réponse appropriée.
- Ce n'est pas laid
Fuirt f = orange;
est moche, pourquoi ne pas faireFruit f = o;
trop et raccourcir de plus pour le rendre encore meilleur? - Je ne comprends pas la question entièrement. Voulez-vous référer à des entités différentes avec le même nom?
Vous devez vous connecter pour publier un commentaire.
En C, il n'y a pas d'autre solution que de préfixer les noms des énumérations.
Comme l'a souligné dans l'OP, C++ dispose d'un certain nombre de mécanismes, dont
enum class
est indiqué par un code moderne. Cependant, dans la pratique, le résultat est le même: vous vous retrouvez en préfixant le nom de la enum élément avec le nom de l'enum. Sans doute,Fruit::orange
est plus propre queFruitOrange
, mais vraiment il fait peu de différence à mes yeux.Dans un univers parallèle, il serait bon d'avoir une langue dans laquelle vous pouvez écrire:
et le compilateur en déduire l'espace de noms de la constante sur le côté droit. Mais je ne vois pas comment cette langue pourrait être de C. C de ne pas disposer d'espaces de noms dans ce sens, et même si elle l'a fait, le type de système permet uniquement de conversions; vous ne pouvez pas la condition de la syntaxe de la RHS d'un opérateur basé sur le LHS (et j'utilise le mot " syntaxe délibérément, parce que la recherche d'un nom est une propriété syntaxique en C).
Même si vous n'langue hack qui parfois implictly inséré une énumération de noms, vous auriez encore besoin du préfixe explicite sur toute comparaison, parce que
ne dispose pas d'un contexte dans lequel la déduction pourrait avoir lieu, même si le fait que les valeurs de l'enum en C sont tous de type
int
ne faireFruitApple
etFruitOrange
comparables.