IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

enum / define


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut enum / define
    Bonjour,

    Y a-t-il un réel avantage à utiliser un enum plutôt qu'un #define, quand on en a la possibilité ?

  2. #2
    Invité(e)
    Invité(e)
    Par défaut
    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.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #define TOTO 
    #define TITI 1,5
    Une macro peut aussi être modifiée.
    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);
    Alors que l'enum ne peut prendre que des valeurs entières et possède forcement une valeur.
    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 :

  3. #3
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    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 :
    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);
    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

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 299
    Par défaut
    Pour ma part, j'utilise #define quand je veux fixer une valeur à une variable, typiquement :

    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 */
    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

  5. #5
    Invité(e)
    Invité(e)
    Par défaut
    Citation Envoyé par salseropom Voir le message
    Pour ma part, j'utilise #define quand je veux fixer une valeur à une variable, typiquement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    #define PI 3.1415 /* pi (OK il faut mettre plus de décimales mais je ne les connais pas) $/
    Pour info, on trouve souvent M_PI défini dans math.h, c'est pi avec un vingtaine de décimales.

  6. #6
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Par défaut
    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).

Discussions similaires

  1. #define VS typedef enum
    Par Bktero dans le forum Débuter
    Réponses: 9
    Dernier message: 11/06/2010, 09h13
  2. USER DEFINE FONCTION : PB éxécution requête
    Par juelo dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 26/01/2004, 11h12
  3. [TABLE][ENUM] u champs à choix multiple ?
    Par narmataru dans le forum SQL
    Réponses: 2
    Dernier message: 04/11/2003, 10h25
  4. Define sur plusieurs lignes
    Par Gogoye dans le forum C
    Réponses: 6
    Dernier message: 06/10/2003, 11h45
  5. define avec GCC.
    Par vagabon dans le forum Autres éditeurs
    Réponses: 4
    Dernier message: 12/06/2003, 14h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo