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 :

ifndef et redéfinition


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Février 2011
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 22
    Par défaut ifndef et redéfinition
    Bonjour

    Je coince sur un problème tout bête.
    J'ai défini dans un fichier.h un certain nombre de structures avec des fonctions amies :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    #ifndef M_PI_2
    #define M_PI_2  1.57079632679489661923
    #endif
     
    #ifndef H2D_H
    #define H2D_H
     
    typedef struct h2Dvector {
        double x, y, t;
     
    	h2Dvector () : x(0), y(0), t(0) {};
    	h2Dvector (double a, double b, double c) : x(a), y(b), t(c) {};
        // binary operators
        friend h2Dvector operator + ( const h2Dvector&, const h2Dvector&);
        friend h2Dvector operator - ( const h2Dvector&, const h2Dvector&);
        friend h2Dvector operator * ( double, const h2Dvector& );
        friend h2Dvector operator * ( const h2Dvector&, const h2Dmatrix&);
     
    } h2Dpoint, h2Dvector, *p2Dpoint, *p2Dvector;
     
    h2Dvector operator + ( const h2Dvector& V1, const h2Dvector& V2)
    {
        h2Dvector V;
        V.x = V1.x + V2.x;
        V.y = V1.y + V2.y;
        if ((V1.t > 0) || (V2.t > 0)) V.t = 1; else V.t = 0;
        return V;
    }
     
    (et coetera...)
     
    #endif
    J'ai, comme il se doit, encadré ces déclarations par un #ifndef et un #endif.
    Lorsque je fais une fois appel à ce fichier .h, tout se passe bien. Je compile et ça s'exécute comme il faut.

    entête hTopo.h :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    #ifndef HTOPO_H
    #define HTOPO_H
     
    #include "h2D.h"     // le fichier d'entête ci-dessus
     
    (etc...)
     
    #endif
    fichier hTopo.cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    #include "htopo.h"
     
    (etc...)
    Si maintenant j'ajoute un autre fichier faisant appel à ce fichier hTopo, patatras, ça ne marche plus !

    entête autrefichier.h :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    #ifndef OFICHIER_H
    #define OFICHIER_H
     
    #include "hTopo.h"     // le fichier d'entête ci-dessus
     
    (etc...)
     
    #endif
    fichier autrefichier.cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    #include "autrefichier.h"
     
    (etc...)
    Je me retrouve avec une erreur LNK2005 de redéfinition de structire et de fonctions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    hTopo.obj : error LNK2005: "struct h2Dvector __cdecl operator+(struct h2Dvector const &,struct h2Dvector const &)" (??H@YA?AUh2Dvector@@ABU0@0@Z) déjà défini(e) dans autrefichier.obj
    Quelqu'un a-t'il une idée qui pourrait m'aider ?
    Merci par avance.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Declare tes fonctions libres définis dans les fichiers headers comme étant inline

  3. #3
    Membre averti
    Inscrit en
    Février 2011
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 22
    Par défaut
    Et bien oui, ça marche ! Merci...

    Mais ça veut dire que le code sera ajouté par le compilateur à chaque appel de la fonction, n'est-ce pas ? Ce n'est pas vraiment optimum en terme de taille du code objet...

    (et encore une fois merci pour cette réponse ultra rapide)

  4. #4
    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 : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par antonien Voir le message
    Mais ça veut dire que le code sera ajouté par le compilateur à chaque appel de la fonction, n'est-ce pas ? Ce n'est pas vraiment optimum en terme de taille du code objet...
    Pas nécessairement, c'est au final le compilateur qui a le dernier mot et il peut très bien ne pas inliner la fonction malgré la présence du inline dans le code.
    Si tu souhaites vraiment avoir ces fonctions définies dans le header, il n'y a pas trop le choix.

    La question que je me pose surtout est pourquoi définir ces fonctions dans un .h et pas dans un .cpp ? (Et également pourquoi faire un typedef de ta structure sous plusieurs noms, y compris en masquant des pointeurs parfois ?)

  5. #5
    Membre averti
    Inscrit en
    Février 2011
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 22
    Par défaut
    Tu as raison pour le typedef, il n'apporte rien et je j'ai enlevé.
    Pour les fonctions, je croyais qu'il fallait mettre les fonctions indépendantes amies dans le header avec les structures qui font appel à elles. N'est-ce pas le cas?

  6. #6
    Membre Expert
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Par défaut
    non.

    d'autant plus que ici le friend ne sert a rien. La bonne facon d'ecrire ce genre d'operateur est d'ecrire un operateur += membre dans la classe et faire que operator+ appele ce dernier.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    struct h2Dvector 
    {
        double x, y, t;
     
        h2Dvector () : x(0), y(0), t(0) {};
        h2Dvector ( const h2Dvector& src ) : x(src.x), y(src.y), t(src.z) {};
        h2Dvector (double a, double b, double c) : x(a), y(b), t(c) {};
     
        h2Dvector& operator+=(const h2Dvector& r)
        {
           x += r.x;
           y += r.y;
           z += r.z;
           return *this;
        }
    }
     
    h2Dvector operator + ( const h2Dvector& l, const h2Dvector& r)
    {
       h2Dvector that(l);
       that += r;
       return that;
    }
    Enfin on est en C++, pas en C, le typedef struct est inutile.
    Je rajouterais que tes membres x,y,z pourrait etre privés et accessible via des accesseurs.

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

Discussions similaires

  1. redéfinition de printf() et scanf()
    Par tut dans le forum C++
    Réponses: 3
    Dernier message: 06/09/2005, 17h18
  2. [FAQ] instruction throw() et redéfinition (dérivation)
    Par PINGOUIN_GEANT dans le forum C++
    Réponses: 16
    Dernier message: 20/01/2005, 17h56
  3. [Héritage] Redéfinition méthode
    Par petit-ourson dans le forum Langage
    Réponses: 9
    Dernier message: 06/05/2004, 16h06
  4. [MFC] redéfinition de BEGIN_MESSAGE_MAP
    Par SethPech dans le forum C++Builder
    Réponses: 2
    Dernier message: 10/03/2004, 13h59
  5. Pourquoi ces directives #ifndef ... en haut des .h
    Par Patrick PETIT dans le forum C
    Réponses: 8
    Dernier message: 06/03/2003, 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