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 :

typedef et enum


Sujet :

C++

  1. #1
    Membre habitué
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 340
    Points : 177
    Points
    177
    Par défaut typedef et enum
    Est-ce que le code suivant est valide en c++ :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    typedef enum _toto toto;
    enum _toto { val1,val2};
    ?

    avec g++, il y a une erreur. Si on mets le typedef après, pas d'erreur. Donc je voulais savoir si le standard interdit cette construction (si oui, un lien serait appréciable)

    merci
    L'Opus attire les Prélats

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    Citation Envoyé par d'Oursse Voir le message
    Est-ce que le code suivant est valide en c++ :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    typedef enum _toto toto;
    enum _toto { val1,val2};
    ?avec g++, il y a une erreur.
    C'est une bonne piste pour dire que non si le compilateur râle (même si les compilateurs ont aussi leurs failles).


    Citation Envoyé par d'Oursse Voir le message
    Si on mets le typedef après, pas d'erreur. Donc je voulais savoir si le standard interdit cette construction (si oui, un lien serait appréciable)

    merci
    typedef permet de créer un synonyme sur un type déjà connu. Donc, il faut que le compilateur connaisse l'énumération avant de pouvoir faire un typedef. En C++98, cela nécessite de la définir. En C++11, il me semble qu'on peut faire une déclaration, ce qui devrait suffire.

  3. #3
    Membre habitué
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 340
    Points : 177
    Points
    177
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Salut,
    C'est une bonne piste pour dire que non si le compilateur râle (même si les compilateurs ont aussi leurs failles).
    certes.


    codeinline]typedef[/codeinline] permet de créer un synonyme sur un type déjà connu.
    pas d'accord. Essaie avec un struct. C'est juste une déclaration de type.

    Et c'est ça qui m'étonne.
    L'Opus attire les Prélats

  4. #4
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Je ne retrouve pas dans la norme comment c'est expliqué, mais en gros :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef struct _titi titi;
    fait une déclaration anticipée de _titi puis un typedef dessus pour définir le synonyme titi.

    En C++98,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef enum _toto toto;
    est illégal car les déclarations anticipées d'énumération sont interdites.

    En C++11, les déclarations anticipées d'énumération sont légales. Le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef enum _toto toto;
    devient valide.

  5. #5
    Membre habitué
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 340
    Points : 177
    Points
    177
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Je ne retrouve pas dans la norme comment c'est expliqué, mais en gros :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef struct _titi titi;
    fait une déclaration anticipée de _titi puis un typedef dessus pour définir le synonyme titi.

    En C++98,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef enum _toto toto;
    est illégal car les déclarations anticipées d'énumération sont interdites.

    En C++11, les déclarations anticipées d'énumération sont légales. Le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef enum _toto toto;
    devient valide.
    merci. Après quelques recherches sur le web, c'est dans la section 7.2.5 des spec C++. Le nombre d'énumérations doit être connu pour calculer la taille du type quand on l'utilise comme argument d'une fonction (pour que la stack soit correctement définie).
    L'Opus attire les Prélats

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

Discussions similaires

  1. Typedef et enum
    Par manticore dans le forum Langage
    Réponses: 11
    Dernier message: 21/02/2013, 21h40
  2. TypeDef enum syntaxe.
    Par Noun-S dans le forum Langage
    Réponses: 0
    Dernier message: 12/05/2011, 11h40
  3. #define VS typedef enum
    Par Bktero dans le forum Débuter
    Réponses: 9
    Dernier message: 11/06/2010, 09h13
  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