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 :

Structures en C++


Sujet :

C++

  1. #1
    Membre éclairé Avatar de nicolas66
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    326
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 326
    Par défaut Structures en C++
    Bonjour,

    Je rencontre un petit problème sur les structure en C++. La portion de code ci-dessous qui provient d'un fichier C compile sans erreurs à l'aide de gcc. En revanche, dès que j'essaye de compiler le code avec g++, il m'indique l'erreur suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    test.cpp:18: error: conflicting declaration 'typedef struct SCell* SCell'
    test.cpp:10: error: 'struct SCell' has a previous declaration as 'struct SCell
    Voici le code correspondant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    struct SCell
    {
    	Real m_Value;
    	unsigned int m_RowIndex;
    	unsigned int m_ColumnIndex;
    	struct SCell * m_pNextRow;
    	struct SCell * m_pNextColumn;
    };
     
    // instruction qui pose problème
    typedef struct SCell * SCell;
    Merci d'avance à ceux qui pourront m'aider car je ne vois comment rendre possible l'exécution de ce code à la fois sous gcc ET sous g++


    Nico.

  2. #2
    Membre chevronné Avatar de Mayti4
    Inscrit en
    Février 2004
    Messages
    442
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 442
    Par défaut
    typedef struct SCell * SCell;
    Donne-lui un autre nom que SCell.

    typedef struct SCell * PSCell;

  3. #3
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Mieux, ne mets pas de typedef, une structure, c'est une classe, donc on l'utilise comme tel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    struct SCell
    {
    //...
    }
     
    typedef SCell* pSCell;
    Et encore, pourquoi faire un typedef sur un pointeur ? Ca n'améliore pas la lisibilité du code.

  4. #4
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Une des différences entre le C et le C++ dans ce qu'ils ont en commun, c'est bien le traitement de ce que le C appelle des structure tag.

    En C, ces noms sont dans un espace séparé et n'entre donc en conflit avec rien d'autre; il faut toujours les précéder de struct quand on les emploie. Il est donc courant d'introduire un typedef pour le même nom mais désignant la structure:En C++, ce sont des noms de type et ils sont utilisables directement partout ou on a besoin d'un type. Par compatibilité avec le C, est autorisé, mais c'est redondant.

    Je n'avais jamais vu ce que tu as fait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef struct SCell * SCell;
    (autrement dit ça va suprendre pas mal de gens habitués au C), et en C++ c'est interdit car tu donnes une seconde avec un typedef une seconde définition pour un nom qui n'est pas équivalente à la première.

  5. #5
    Membre éclairé Avatar de nicolas66
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    326
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 326
    Par défaut
    D'après ce que j'ai compris, il faudrait que j'enlève le 'typedef' pour ne plus cacher mes pointeurs derrière un alias et donc améliorer la lisibilité du code ?

    En fait, à la base, j'avais simplement utilisé le typedef afin d'avoir moins de chose à écrire

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Ou que tu corriges tes typedefs pour que le pointeur y soit explicite...

    De plus, je te conseillerais de les mettres en majuscules (mais là, c'est le windowsien qui parle)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    typedef struct SCell SCELL, * PSCELL;
    typedef const struct SCell * PCSCELL;
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par Médinoc
    De plus, je te conseillerais de les mettres en majuscules
    Moi je conseille fortement de réserver les identificateurs tout en majuscule pour les macros et rien que pour les macros. Les identificateurs utilisés pour les macros obéissent à d'autres règles que les autres et les effets d'une macro venant modifier ce qu'on pensait être un identificateur banal sont parfois très amusants... pour ceux qui n'ont pas à chercher la cause des problèmes.

  8. #8
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par nicolas66
    D'après ce que j'ai compris, il faudrait que j'enlève le 'typedef' pour ne plus cacher mes pointeurs derrière un alias et donc améliorer la lisibilité du code ?

    En fait, à la base, j'avais simplement utilisé le typedef afin d'avoir moins de chose à écrire
    Le problème n'est pas avec un typedef qui cache un pointeur. C'est une question de style. Personnellement je ne le fais pas mais ça ne me gène pas du tout; en fait j'ai jamais très bien compris les raisons de ceux pronant cette interdiction. En particulier dans le cadre du C++ qui permet d'utiliser -> pour autre chose que les pointeurs.

    Tu peux donner un typedef pour le pointeur, le problème c'est que le nom que tu avais choisis désignait déjà autre chose dans le scope: le type pointé. Hors, il est interdit de donner deux définitions au même identificateur dans le même scope. Deux exceptions:
    - on peut surcharger les fonctions
    - on peut donner avec un typedef une définition redondante.

    Si tu n'as pas besoin de compatibilité avec le C, tu ne fait pas de typedef donnant une définition de SCell. Tu fais éventuellement un typedef pour donner un nom à SCell*.

    Si tu as besoin de la compatibilité avec le C, tu fais un typedef
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef struct SCell SCell;
    et tu fais éventuellement un typedef pour donner un nom à SCell*.

  9. #9
    Membre éclairé Avatar de nicolas66
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    326
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 326
    Par défaut
    En définitive, j'ai opté pour mettre un nom différent dans le 'typedef'. En tout cas, merci pour vos réponses et votre aide


    Nico.

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

Discussions similaires

  1. recuperation de la structure d'une base
    Par pascalT dans le forum 4D
    Réponses: 7
    Dernier message: 07/06/2006, 15h32
  2. [tables systèmes] extraction de la structure d'une base
    Par laffreuxthomas dans le forum Autres SGBD
    Réponses: 6
    Dernier message: 23/03/2006, 13h24
  3. [VB6] [Fichier] Enregistrer des variables de structure
    Par de.bo dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 07/10/2002, 11h09
  4. Structure de données de type "RECORD"
    Par chaours dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 30/09/2002, 17h10
  5. longueur d'une structure
    Par bohemianvirtual dans le forum C
    Réponses: 6
    Dernier message: 28/05/2002, 18h31

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