Bonjour,
Y a-t-il un réel avantage à utiliser un enum plutôt qu'un #define, quand on en a la possibilité ?
Bonjour,
Y a-t-il un réel avantage à utiliser un enum plutôt qu'un #define, quand on en a la possibilité ?
Bonjour,
Le problème d'une macro (#define), c'est qu'elle peut être tout et n'importe quoi, en cas de problème, c'est l'endroit de l'appel et non celui de la définition qui est pointé par le compilateur.
Une macro peut aussi être modifiée.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 #define TOTO #define TITI 1,5
Alors que l'enum ne peut prendre que des valeurs entières et possède forcement une valeur.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 #define TOTO 10 printf("%d\n", TOTO); #ifdef TOTO #undef TOTO #define TOTO 100 #endif printf("%d\n", TOTO);
L'enum permet aussi de regrouper des valeurs qui vont dans le même sac facilement.
Sinon, si c'est juste pour définir des constantes, une troisième possibilité : les constantes :
Code : Sélectionner tout - Visualiser dans une fenêtre à part const int TOTO = 10;
L'utilisation de enum plutôt que procéder par #define ou par la définition de constantes permet d'apporter une information à la lecture du code en définissant un type : Les variables de ce type sont censées prendre une des valeurs de l'énumération mais pas une autre (mais hélas elles n'y sont pas obligées).
Pour illustrer :
Ecrire couleur = 10 est (malheureusement) possible mais il n'est pas normal de donner à une énumération une valeur qui ne figure pas symboliquement dans l'enum
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 typedef enum {Rouge, Orange, Jaune, Vert, Bleu, violet} TCouleur; TCouleur CouleurComplementaire(TCouleur couleur){...} TCouleur couleur = Vert; TCouleur coulcomp = CouleurComplementaire(couleur);
Pour ma part, j'utilise #define quand je veux fixer une valeur à une variable, typiquement :
L'énorme avantage des enum par rapport à #define, comme le dit diogène, c'est de pouvoir rassembler tout plein de variables qui ont le même "type" (couleurs pour reprendre son exemple) et d'augmenter la lisibilité du code
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 #define PI 3.1415 /* pi (OK il faut mettre plus de décimales mais je ne les connais pas) $/ #define EPS 1e-10 /* precision pour comparer 2 doubles */ #define DEGTORAD blabla /* degre to radian */
Surtout, la différence fondamentale entre un #define et un enum, est que l'un est reconnu du compilateur (l'enum) en tant que type (avec les contrôles sémantiques associés), et que l'autre ne l'est pas (le préprocesseur converti le nom en sa valeur).
Conséquence : un #define peut représenter n'importe quoi en C (une expression quelconque retournant un type quelconque, un fragment de code C, ...), alors qu'un énuméré est équivalent à type "int" habillé de valeurs numériques entières nommées (Rouge, Orange, Jaune, Vert, Bleu, violet dans l'exemple de diogene).
Partager