Version C

En C, il était possible de créer des constantes symboliques à la chaîne en utilisant des enum :

enum tata {
	RIRI,
	FIFI,
	LOULOU,
};

Les constantes symboliques crées ont des valeur numérique qui s’incrémentent au fur et a mesure.

Ici :

  • RIRI vaut 0
  • FIFI vaut 1
  • LOULOU vaut 2

Ces énumérations existent en C++ mais leur inconvénient c’est que les constantes qu’elles définissent appartiennent à l’étendue globale. Cela signifie que deux enums ne peuvent pas partager un même nom de symbole.

enum tata {
    RIRI,
    FIFI,
    LOULOU,
};

enum toto {
    LOULOU,
    TOTO,
    TATA
};
$ g++ main.cpp -Wall -Wextra
main.cpp:8:5: error: ‘LOULOU’ conflicts with a previous declaration
    8 |     LOULOU,
      |     ^~~~~~
main.cpp:4:5: note: previous declaration ‘tata LOULOU’
    4 |     LOULOU,
      |     ^~~~~~

Version C++

En C++ il est possible de déclarer des enum class qui sont des énumérations dont les constantes existent dans une étendue propre.

enum class Tata {
    RIRI,
    FIFI,
    LOULOU,
};

enum class Toto {
    LOULOU,
    TOTO,
    TATA
};

On ne peut pas accéder aux constantes symboliques d’une enum class juste en écrivant leur nom. Il faut les préfixer sur nom de l’énumération et de ::.

int main(void)
{
    Tata tata_val{Tata::LOULOU};
    Toto toto_val{Toto::LOULOU};

    std::cout <<  static_cast<int>(tata_val) << std::endl;
    std::cout <<  static_cast<int>(toto_val) << std::endl;
}

Sortie :

2
0

On constate bien que les deux enums coexistent avec une constante qui s’appelle pareil mais qui ne vaux pas la même chose.