Partage
  • Partager sur Facebook
  • Partager sur Twitter

Errerur : multiple definition of ...

Sujet résolu
    6 mai 2008 à 10:37:56

    Bonjour,

    Je reviens d'une assez longue période d'infidélité et forcément je rencontre pas mal de problèmes.

    J'ai apparemment des fonctions d'un .h qui sont redéfinies dans mon programme. Je ne comprends pas pourquoi car il me semblait que les ifndef permettait justement de résoudre ce genre de problème.

    #ifndef _RANDOM_H
    #define	_RANDOM_H
    
    #include <stdlib.h>
    #include <time.h>
    #include <unistd.h>
    void randomize()
    {
      time_t seed;
      time_t arg;
      seed=time(&arg);
      srand(unsigned(seed+getpid()));
    }
    
    long aleatoire(long borne)
    {
      return(rand()%borne); 
    }
    
    #endif /* _RANDOM_H */
    


    Et j'obtiens cette erreur lorsque je dois inclure le .h pour que les fonctions soient déclarées :

    build/Debug/GNU-Linux-x86/Individu.o: In function `aleatoire(long)':
    /home/matthieu/NetBeansProjects/ModTarifPlan/Random.h:22: multiple definition of `aleatoire(long)'
    build/Debug/GNU-Linux-x86/Main.o:/home/matthieu/NetBeansProjects/ModTarifPlan/Random.h:22: first defined here
    build/Debug/GNU-Linux-x86/Individu.o: In function `randomize()':
    /home/matthieu/NetBeansProjects/ModTarifPlan/Random.h:14: multiple definition of `randomize()'
    build/Debug/GNU-Linux-x86/Main.o:/home/matthieu/NetBeansProjects/ModTarifPlan/Random.h:14: first defined here


    Donc voilà si quelqu'un a une solution pour moi ça m'intéresse fortement.

    C'est peut-être tout con mais là j'avoue que je sèche un peu ...
    • Partager sur Facebook
    • Partager sur Twitter
      6 mai 2008 à 10:42:45

      Ou tu déplaces le corps de tes fonctions dans un .cpp, ou tu déclares tes fonctions comme inline. Tu ne peux pas empêcher la "multiple" inclusion, parce que chaque cpp qui inclut ton .h a le corps de ta fonction, d'où ton erreur.

      Tu peux également compiler avec /FORCE:MULTIPLE (enfin sous VS, je suppose que ca marche pareil pour les autres compilo ? :euh: )
      • Partager sur Facebook
      • Partager sur Twitter
        6 mai 2008 à 10:50:35

        Exact merci ça marche très bien en passant la fonction en inline :)

        Que se passe-t-il exactement au niveau de la fonction quand celle-ci est en inline ?

        Merci
        • Partager sur Facebook
        • Partager sur Twitter
          6 mai 2008 à 10:58:26

          simple, quand le compilo parcours ton code, quand il va tomber sur un appel à ta fonction, il va tout simplement "enlever" l'appel, et copier l'intégralité de ton code à la place.

          Pour l'exemple :

          inline void a(int & o) {++++o;}
          
          void main() {
              int i;
              a(i);
          }
          


          compilé, le code ressemble en fait à la compilation de ce code-ci
          void main() {
              int i;
              ++++i;
          }
          
          • Partager sur Facebook
          • Partager sur Twitter
            6 mai 2008 à 11:05:38

            Ok merci beaucoup

            Donc plus de rapidité mais aussi plus d'espace mémoire utilisé du coup ?
            • Partager sur Facebook
            • Partager sur Twitter
              6 mai 2008 à 11:10:56

              C'est ça, tu as compris ;)
              • Partager sur Facebook
              • Partager sur Twitter

              Errerur : multiple definition of ...

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown