6
votes

Les valeurs d'enum se comportent-elles comme des variables globales?

J'ai deux énumes, et s'il y a une valeur dans une enum avec le même nom qu'une valeur dans l'autre Enum: xxx

Le compilateur (Visual Studio's) se plaint de la redéfinition de Doc , qui l'implique qu'il la traite comme une variable globale. Est-ce vrai? Ce n'est pas le comportement que j'attendrais et cela me force à gérer des noms de tous les éléments énumants de mon projet.

Toute perspective aiderait.


4 commentaires

Pourrions-nous voir plus de code? Peut-être que le problème est quelque chose autour.


Ce n'est pas un comportement normal du compilateur, Afaik.


Désolé, je ne le savais pas! Et c'est pareil pour c?


@YKATCHOU: Cela se produit si les deux lignes ci-dessus sont les seules lignes du fichier CPP étant compilées.


7 Réponses :


5
votes

Les énumérateurs en C ++ 03 ont la même portée que l'énumération.

enum     xxx    {    yyy,       zzz       };
          ^           ^          ^ 
    enumeration    enumerator enumerator


0 commentaires

1
votes

Les valeurs de l'ENum ont la portée de l'ENUM elle-même, c'est-à-dire que c'est une portée de déclaration. Par exemple: xxx

x sera 32.


2 commentaires

Nope, mais vous aurez 11 erreurs dans votre code. Essayez de le compiler


Mais si vous changez Enum 1 à Enum A et Enum 2 à Enum b Le code va compiler et vous allez toujours montrer la portée. Gagnant-gagnant?



2
votes

Les valeurs d'une énumération existent dans n'importe quelle portée le Enum code> a été déclaré dans.

Les travaux suivants, par exemple: P>

class A_class { enum A {joe, bob, doc}; };
class B_class { enum B {sunday, monday, doc}; };


0 commentaires

4
votes

Si vous voulez qu'ils soient globaux, corrigez votre problème et évitez la pollution des espaces de noms en lançant votre Enum code> S dans un espace de noms:

namespace A
{
    enum A {joe, bob, doc};
}
namespace B
{
    enum B {sunday, monday, doc};
}

A::doc;
B::doc;


0 commentaires

10
votes

Il n'est pas traité comme une variable globale . Il est traité comme un identifiant global .

plus précisément, il est traité comme un identifiant dans tout espace de noms que le Enum est déclaré dans votre cas. Dans votre cas, c'est l'espace de noms global.

Pour une idée de la différence entre un identifiant global et une variable globale, essayez de prendre l'adresse de votre énum. ;)

Habituellement, lorsque je définirai Enums, je prépends la version abrégée du nom de l'identifiant. Comme ceci: xxx

Ceci aide à éviter les collisions.


2 commentaires

J'allais rire durement si de toutes les réponses à cette question à cette question n'avait pas répondu au problème de la variable. +1


J'ai senti que "variable" n'est pas le bon terme, mais je n'en ai pas eu de meilleur (maintenant j'ai ...)



9
votes

Wyatt Anderson a déjà suggéré

A::doc;
B::doc;


0 commentaires

1
votes

Disons que nous voulons déclarer le rapport de format pour une fenêtre graphique. Ensuite, définissez les valeurs ENUM comme déjà suggéré:

enum class values
{
    ASPECT_RATIO_16_9,  // HD video
    ASPECT_RATIO_16_2,  // *for testing purposes*
    ASPECT_RATIO_4_3,   // standard monitor
    ASPECT_RATIO_3_2,   // classic film
    ASPECT_RATIO_21_9,  // cinemascope
    ASPECT_RATIO_1_1    // quadratic window
};


0 commentaires