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

Langage C++ Discussion :

Les mystères du linkage de l'ouest


Sujet :

Langage C++

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 47
    Points : 36
    Points
    36
    Par défaut Les mystères du linkage de l'ouest
    Bonjour,

    Quelqu'un pourrait m'expliquer pourquoi ce code ne se link pas avec g++/ld ?

    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
    #include <cstddef>
     
    class Pixel {
    public:
      static const unsigned char ERROR_CODE = 0;
      static unsigned char getRed(const unsigned char* pixel);
    };
     
    inline unsigned char Pixel::getRed(const unsigned char* pixel) {
      return (pixel == NULL) ? ERROR_CODE : pixel[0];
    }
     
    int main() {
      Pixel::getRed(NULL);
    }
    ld retourne l'erreur suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    /tmp/ccUG68Zg.o: In function `Pixel::getRed(unsigned char const*)':
    test.cc:(.text._ZN5Pixel6getRedEPKh[Pixel::getRed(unsigned char const*)]+0x1b): undefined reference to `Pixel::ERROR_CODE'
    collect2: ld a retourné 1 code d'état d'exécution
    En revanche, si je remplace :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return (pixel == NULL) ? ERROR_CODE : pixel[0];
    par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      if (pixel == NULL)
        return ERROR_CODE;
      else
        return pixel[0];
    le linker est content.

    Ou alors autre alternative, on garde :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return (pixel == NULL) ? ERROR_CODE : pixel[0];
    mais on transforme la constante en int au lieu d'un unsigned char.

    J'avoue que pour moi ça relève du paranomal là .

  2. #2
    Membre actif Avatar de Rewpparo
    Homme Profil pro
    Amateur
    Inscrit en
    Décembre 2005
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Amateur

    Informations forums :
    Inscription : Décembre 2005
    Messages : 170
    Points : 281
    Points
    281
    Par défaut
    Pour moi ce qui est paranormal c'est que ca link dans les cas que tu cites. Il me semble qu'il faut mettre la définition de ta variable statique après la déclaration de ta classe. Mais je ne met jamais de déclaration de classe dans un cpp, donc je suis pas sur de moi pour ce cas précis.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 47
    Points : 36
    Points
    36
    Par défaut
    Citation Envoyé par Rewpparo Voir le message
    Il me semble qu'il faut mettre la définition de ta variable statique après la déclaration de ta classe.
    Pas dans le cas d'une variable statique constante à type primitif.

    Citation Envoyé par Rewpparo Voir le message
    Mais je ne met jamais de déclaration de classe dans un cpp, donc je suis pas sur de moi pour ce cas précis.
    Ça ne change rien, le #include d'un .h ne résulte qu'en une concaténation du contenu du .h devant le contenu du .cc/.cpp par le pré-processeur.

Discussions similaires

  1. [POO] Les mystères de l'attribut protected
    Par Lawyer666 dans le forum C++
    Réponses: 6
    Dernier message: 30/10/2008, 12h51
  2. Les Mystères de la programmation
    Par swingNJava dans le forum C
    Réponses: 10
    Dernier message: 28/05/2008, 14h50
  3. les mystères de JTable.
    Par swingNJava dans le forum Composants
    Réponses: 2
    Dernier message: 29/11/2007, 08h52
  4. [POO] les mystères du __toString()
    Par Herode dans le forum Langage
    Réponses: 2
    Dernier message: 07/03/2007, 21h33
  5. les mystères d'access
    Par Jeffboj dans le forum Access
    Réponses: 4
    Dernier message: 02/05/2006, 15h17

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