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 :

Déclaration des structures


Sujet :

C

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 124
    Par défaut Déclaration des structures
    Bonjour,

    J'ai une incompréhension sur la manière dont les structures sont souvent déclarées.

    On peut déclarer un structure comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    typedef struct ma_structure {
        int var1;
        char var2;
    } nom_struct;
     
     
    typedef nom_struct*    pt_struct;
    typedef nom_struct     une_struct;
    Quel est l'intérêt de typedef nom_struct* pt_struct
    et de typedef nom_struct une_struct ?

  2. #2
    Membre chevronné
    Inscrit en
    Décembre 2010
    Messages
    290
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 290
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    typedef nom_struct     une_struct;
    Cette construction fait que une_struct est synonyme de nom_struct. En apparence c'est redondant mais ce n'est pas forcément une mauvaise chose. Par exemple, tu pourrais vouloir qu'une partie de ton code considère la structure une_struct comme un peu "opaque". Il se trouve que dans cette implémentation là elle correspond à nom_struct mais dans une version future ou suivant une compilation conditionnelle, elle pourrait en fait correspondre à une autre structure sous-jacente. Suivant les pratiques de programmation, cela peut être une construction tout à fait valable.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    typedef nom_struct*    pt_struct;
    pt_struct est donc synonyme de "pointeur vers un nom_struct". Ceci s'utilise souvent pour alléger le code. C'est une question de style mais certains préfèrent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    void MaFonction (pt_struct input);
    plutôt que ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    void MaFonction (nom_struct* input);
    Même si pour le compilateur c'est exactement la même chose.

    Toutefois, tu peux aussi faire ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    typedef struct nom_struct *pt_struct;
    Ceci explique au compilateur que pt_struct est synonyme de "Pointeur vers une structure qui répond au nom de nom_struct". Le C supporte les pointeurs vers structures "opaques", c'est à dire que tant que tu n'essayes pas d'accéder à un champ de la structure, de connaitre sa taille via sizeof() ou de déclarer une variable de ce type, tu as tout à fait le droit de ne pas DEFINIR cette structure.
    Par exemple, on utilise souvent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    /* objet.h */
    typedef struct ObjetOpaque_s* PtrObjetOpaque;
     
    PtrObjetOpaque CreerObjet (void);
    Cette technique permet à l'implémentation de faire varier le contenu de "ObjetOpaque_s", parfois même sans nécessiter une recompilation de l'appelant (ce qui peut être utile si tu as une compatibilité binaire à assurer).
    Tout ce que l'appelant sait, c'est manipuler des POINTEURS vers des objets opaques, mais il n'en connait pas le contenu.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 124
    Par défaut
    Merci tu réponds parfaitement à ma question. Il faut encore que j'étudie ta réponse mais elle est très complète.

    Toute fois une question subsidiaire me vient à l'esprit.

    Pourquoi définit t on les structures comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    typedef struct ma_structure {
        int var1;
        char var2;
    } nom_struct;
    et non comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    typedef struct nom_struct {
        int var1;
        char var2;
    };

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 124
    Par défaut
    Je crois que j'ai compris struct ma_struct équivalent à nom_struct...

    En c++ cela est implicite, je trouve ça pas plus mal.

  5. #5
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par DavidleVrai Voir le message
    Merci tu réponds parfaitement à ma question. Il faut encore que j'étudie ta réponse mais elle est très complète.

    Toute fois une question subsidiaire me vient à l'esprit.

    Pourquoi définit t on les structures comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    typedef struct ma_structure {
        int var1;
        char var2;
    } nom_struct;
    et non comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    typedef struct nom_struct {
        int var1;
        char var2;
    };
    Parce que la forme de typedef est : typedef type_existant synonyme_cree La 2e écriture est donc fausse, il n'y a pas de synonyme. Enfin pas exactement, elle crée quand même le type de la structure mais tu devras utilisé explicitement le mot clé struct pour en créer une instance. La première écriture est correcte mais ma_structure n'a pas d'intérêt ici. Voir cette entrée intéressante de C-FAQ : http://c-faq.com/struct/typedef.html

    Par exemple le code suivant ne produit un warning intéressant (il y a 2 autres warnings car a et b sont inutilisés) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    typedef struct nom_struct {
        int var1;
        char var2;
    };
     
    typedef struct nom_struct nom_struct;
     
     
    int main(void)
    {
        struct nom_struct a;
        nom_struct b;
        return 0;
    }
    main.c|warning: useless storage class specifier in empty declaration [enabled by default]|

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 124
    Par défaut
    Merci ! J'ai compris maintenant.

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

Discussions similaires

  1. déclaration des tableaux structurés
    Par sarafou7 dans le forum C
    Réponses: 1
    Dernier message: 29/01/2011, 09h43
  2. [MASM32] Déclaration des variables
    Par mrousse dans le forum x86 32-bits / 64-bits
    Réponses: 2
    Dernier message: 30/09/2005, 14h30
  3. Réponses: 1
    Dernier message: 10/06/2005, 11h37
  4. [DB2] Ordre de déclaration des variables
    Par Fatah93 dans le forum DB2
    Réponses: 1
    Dernier message: 04/05/2005, 17h18
  5. Réponses: 5
    Dernier message: 10/11/2004, 19h44

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