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 :

#define VS typedef enum


Sujet :

C

  1. #1
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut #define VS typedef enum
    Bonjour !

    Le titre résume la question.

    Avec mon collègue stagiaire, on essaye de définir un maximum de noms symboliques pour décrire les valeurs possibles pour certaines valeurs. Cela permet un code plus lisible. Jusque là, normal

    Là où on commence à se poser des questions, c'est de savoir s'il est plus intéressant d'utiliser une série de "#define" ou un "typedef enum" pour lister les valeurs possibles. La liste pour une variable donnée est assez longue. Je précise qu'on travaille sur des systèmes embarqués (micro-controleur PIC de chez Microchip) et qu'on se demande su l'une permet un gain de vitesse d'exécution et/ou de place en mémoire programme?

    Quel est l'intérêt de l'un par rapport à l'autre ?


    Merci d'avance !



    PS: j'ai lu ces deux pages, elles ne m'ont pas aidé ^^
    http://c.developpez.com/cours/bernar...hp#enumeration
    http://c.developpez.com/cours/bernar...gne/node92.php

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    A mon avis, il n'y a aucun gain côté performance ou taille du binaire.

    Le gros plus est plutôt au niveau de la lecture ou du debuggage. Je préfère une fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    error_t GetLastError(void)
    plutôt qu'une fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int GetLastError(void).
    C'est plus facile à lire et a comprendre (même si cela fait la même chose).

    De plus, les debuggeurs savent afficher le code symbolique d'une énumeration et c'est plus rapide à diagnostiquer un "InvalidParam" que "12" dans le debugger.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    Invité(e)
    Invité(e)
    Par défaut
    De plus, en cas d'erreur dans la définition, soit des macro, soit de l'énumération, le compilateur aura un message plus clair et plus localisé dans le second cas.

  4. #4
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 062
    Points
    219 062
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    Il faut juste ce rappeler d'une chose. L'enum va empecher de passer deux flags à la fois, en paramètre d'un fonction ( avec le | logique ).
    Je dis ça, vous pouvez me prendre pour un idiot, mais lorsque j'avais commencé un code, je pensais que les enums c'était bien ( car restriction dans le choix des valeurs, le compilateur nous empêche de faire trop de betises )... mais au moment ou j'ai eu besoin de passe E1 | E2 , donc deux valeurs différentes de mon enum ... j'ai du remplacé par le define.

    Je me répète un peu, le problème du define est que si l'utilisateur passe '42' alors qu'il n'y a aucun define avec la valeur 42 ... et bah le compilateur ne dira rien ( logique )
    Donc ... pour moi ... un enum, c'est toujours mieux si on veut se pencher sur le restriction des valeurs que l'on peut passer. ( Soit, si on veut avoir le compilateur qui nous aide )
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  5. #5
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    -
    Il faut juste ce rappeler d'une chose. L'enum va empecher de passer deux flags à la fois, en paramètre d'un fonction ( avec le | logique ).
    Il suffit de définir la valeur des termes de l'enum comme on le fait par #define

    -
    Je me répète un peu, le problème du define est que si l'utilisateur passe '42' alors qu'il n'y a aucun define avec la valeur 42 ... et bah le compilateur ne dira rien ( logique )
    Donc ... pour moi ... un enum, c'est toujours mieux si on veut se pencher sur le restriction des valeurs que l'on peut passer. ( Soit, si on veut avoir le compilateur qui nous aide )
    Le compilateur n'est d'aucun secours pour cela : il ne vérifie pas si une valeur appartient à une enum.

    Une enum définit simplement des symboles pour des valeurs entières. A la différence des #define, ceci ne procède pas par simple remplacement de texte.
    L'avantage, non négligeable, d'une enum sur des #define est documentaire en C. Si une variable ou un paramètre est d'un type enum, alors la logique veut que sa valeur soit égale à un des termes de l'énumération. Elle regroupe donc toutes les valeurs possibles que la grandeur est susceptible de prendre (en toute logique). Mais en pratique, rien ne l'impose, et certainement pas le compilateur, il ne s'agit que d'une discipline que le programmeur s'impose.
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  6. #6
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par diogene Voir le message
    Le compilateur n'est d'aucun secours pour cela : il ne vérifie pas si une valeur appartient à une enum.
    Nous somme d'accord que la norme n'impose pas de vérification et que si la valeur ne correspond pas il ne s'agit aucunement d'une erreur.

    Toutefois le point sur lequel je me pose une question est : un compilateur donné a-t-il le droit d'émettre un warning dans ce cas de figure ? Je pense que oui (et on rentre dans la qualité de l'implémentation), ce qui peut être une aide intéressante.

  7. #7
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    n1256 dit :
    Annex I
    (informative)
    Common warnings
    ...
    — A value is given to an object of an enumerated type other than by assignment of an enumeration constant that is a member of that type, or an enumeration object that has the same type, or the value of a function that returns the same enumerated type
    qui vérifie si l'utilisation de l'enum est bien cohérente. En fait, il ne s'agit que d'une vérification de type lors d'une assignation, pas que les valeurs obtenues font bien partie de l'énumération (une fonction qui retourne un type enum peut retourner une valeur entière ne faisant pas partie de l'énumération sans warning).

    Il me semble difficile qu'il y ait des vérifications plus poussées de la part du compilateur portant cette fois sur les valeurs pour s'assurer qu'une valeur est effectivement égale à une des constantes de l'énumération.
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  8. #8
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 062
    Points
    219 062
    Billets dans le blog
    120
    Par défaut
    Mince ... pardon pour avoir dit quelque chose de faux. Du coup je suis perplexe sur l'erreur que j'avais eu.

    Sinon, dernier avantage de l'enum est dans le switch(). Car le compilateur peut lancer un warning pour dire que nous n'avons pas défini tout les chemins possible de l'enum. ( Bien sur ... un default va enlever le warning, si je me rappelle bien )
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  9. #9
    Membre expérimenté
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    946
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 946
    Points : 1 351
    Points
    1 351
    Par défaut
    Salut,

    Citation Envoyé par LittleWhite Voir le message
    au moment ou j'ai eu besoin de passe E1 | E2 , donc deux valeurs différentes de mon enum ... j'ai du remplacé par le define.
    Je trouve ça normal, car si tu veux appliquer des masques logiques, tu as du définir ton enum avec flag0 =1, flag1=2, flag2=4, flag3=8, etc... Alors qu'idéalement, on n'a pas besoin de connaitre les valeurs affectées par le compilateur aux éléments de l'enum. Ce côté "boite noire" est même un de ses intérêts. J'utilise enum pour définir les états d'une machine d'état, les codes d'erreurs, bref, des choses qui découlent d'une liste.

  10. #10
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Certains passages étaient philosophiques ^^

    Merci de vos réponses

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. typedef + enum
    Par Joe_Dupont dans le forum Débuter
    Réponses: 3
    Dernier message: 05/03/2012, 22h04
  2. TypeDef enum syntaxe.
    Par Noun-S dans le forum Langage
    Réponses: 0
    Dernier message: 12/05/2011, 11h40
  3. define & typedef!
    Par moon93 dans le forum C
    Réponses: 10
    Dernier message: 19/08/2006, 18h16
  4. Macros et typedef enum {MUR=0x1,etc. HELP !
    Par qwerty999 dans le forum C++
    Réponses: 2
    Dernier message: 07/06/2006, 22h44
  5. [Debutant - 1er jour de C] Typedef enum
    Par kakou dans le forum C
    Réponses: 3
    Dernier message: 28/02/2006, 23h53

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