Prob de déclaration et d'utilisation de variables ds plusieurs fichiers

[Résolu]
Signaler
Messages postés
165
Date d'inscription
samedi 4 juin 2005
Statut
Membre
Dernière intervention
24 octobre 2007
-
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
-
Bonjour,
probleme de débutant mais je séche :/

J'ai mon fichier main.cpp, et deux autres : calc.h et calc.cpp
j'inclus dans les 2 fichiers .cpp le fichier .h. J'ai déclaré des variables (x et y) dans le fichier .h que je souhaite utiliser dans les 2 fichiers .cpp.
Et là, erreur (je boss avec Dev-C++) :
multiple definition of `x'
first defined here
multiple definition of `y'
first defined here
ld returned 1 exit status

les "first defined here" ne pointent sur aucune ligne de code. Du fait je ncomprends pas mes erreurs ...

pour contourner le prob j'ai déclaré les variables dans le fichier calc.cpp et les ai redéclaré avec le préfixe 'extern' dans le fichier main.cpp. Mais le probleme me tracasse, je voudrais savoir ce qui foire ><

Voilà, apportez moi la solution pleeease, merki :)

13 réponses

Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
Si tu peux, mais soit avec le mot clef extern ou static. D'ailleurs, je vois pas bien la différence en pratique entre les deux :)
Messages postés
15
Date d'inscription
mercredi 25 avril 2007
Statut
Membre
Dernière intervention
16 mai 2007

si tu as redeclaré tes varibles x et y dans le main c'est normal!!
Messages postés
165
Date d'inscription
samedi 4 juin 2005
Statut
Membre
Dernière intervention
24 octobre 2007

euh je les ai redéclaré dans le main (avec le mot cle extern, c'est tres important :) justement pour que ca fonctionne ...
C'est quand je ne les "redéclarent" pas (et qu'elles sont déclarés dans le fichier calc.h) que ca foire.
Messages postés
15
Date d'inscription
mercredi 25 avril 2007
Statut
Membre
Dernière intervention
16 mai 2007

mais le probleme vient du fait que quanq tu met #include calc.h dans le main.cpp tes variables sont deja connu par le compilo et lorsqu'il rencontre à nouveau extern int x  et extern int y  il te dit redefinition (j'ai suposé que x et y sont des doubles ici )
ce qui est normal;
Messages postés
165
Date d'inscription
samedi 4 juin 2005
Statut
Membre
Dernière intervention
24 octobre 2007

Le mot cle extern permet ce genre de "redéclaration" (qui n'en est pas une complétement d'ailleurs), non ?
et puis, non, le probleme ne vient pas de là, puisque c'est quand je déclare les variables dans calc.h, en utilisant les var et sans mettre d'extern x etc ... ds main.cpp qu'il y'a erreur !
Et non quand je met des extern double x etc ... dans le main, avec la déclaration des variables ds calc.cpp (auquel cas ca fonctionne impec')
Messages postés
15
Date d'inscription
mercredi 25 avril 2007
Statut
Membre
Dernière intervention
16 mai 2007

 mais en principe les extern de variable sont utilsés par deux fichierx .c et non pas un .h et un point.cpp

c'est justement ce quetu as fait ici :"pour contourner le prob j'ai déclaré les variables dans le fichier calc.cpp et les ai redéclaré avec le préfixe 'extern' dans le fichier main.cpp"

dans ce cas losque que le compilo compile il ne "voit" pas eux fois les variables x et y.

d'ailleurs l'utilité d'une varible globale et de permttre à de fichier cpp de "voir" cette varible et d'agir sur cette varaible. MAIS aucun interet à faire ça entre un fichier .h et une fichier . cpp   
Messages postés
165
Date d'inscription
samedi 4 juin 2005
Statut
Membre
Dernière intervention
24 octobre 2007

Merci pour le rappel sur le mot cle extern. Mais ca n'est pas le sujet.

"d'ailleurs l'utilité d'une varible globale et de permttre à 2 fichier cpp de "voir" cette varible et d'agir sur cette varaible. MAIS aucun interet à faire ça entre un fichier .h et une fichier . cpp "

je n'agit pas sur la variable dans le fichier .h, je veux la déclarer dans le .h ! Alors ma question est : pk je ne peux pas déclarer une variable dans un .h et l'utiliser dans le main ? Sachant qu'au début du fichier .h, j'ai bien mis les entêtes :
#ifndef __CALC_H__
#define __CALC_H__
//etc...
#endif
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
"mais en principe les extern de variable sont utilsés par deux fichierx .c et non pas un .h et un point.cpp" => Absolument pas. Utiliser deux variables dans 2 cpp différent, par contre, ca me parait délirant. La variable doit se trouver dans un header partagé par les deux. Pour moi c'est un pb de struture de programme si tu as de telles déclarations de variables.

Ton pb vient du fait, qu'un header, c'est juste des lignes qui sont "copiées" dans ton cpp durant la compilation. Donc c'est surement plus un message d'avertissement pour te dire que les deux variables ont beau avoir le meme nom, elles ne sont pas égales: une modification de l'une n'entraine aucune modification de l'autre. Donc ce qui se passe en réalité, n'est pas ce à quoi tu penses toi. Alors que le mot clef externe permet de définir un lien vers une unique déclaration de la variable.
Messages postés
165
Date d'inscription
samedi 4 juin 2005
Statut
Membre
Dernière intervention
24 octobre 2007

Ok je vois, merci.
On ne doit donc jamais déclarer de variable dans un header ?
Messages postés
165
Date d'inscription
samedi 4 juin 2005
Statut
Membre
Dernière intervention
24 octobre 2007

Merci luhtor pour les précisions :)
Messages postés
15
Date d'inscription
mercredi 25 avril 2007
Statut
Membre
Dernière intervention
16 mai 2007

Pour luhtor :



il n'y aucun délire a vouloir utiliser  mes variable dans deux fichiers .cpp different!!!!! imagine que dans chaque cpp tu as une fonction et la variable externe. si tu ve comter le nombre de fois ou tu as appelé ces deux fonctions tu as interet à incrementer la meme variable

par ailleurs les lignes du header sont copier durant la pré-compilation et non pas la compilation!!

Pour julien _boss :

#ifndef __CALC_H__
#define __CALC_H__
//etc...
#endif

Rien à voir avec ton pb! cela c'est pour eviter les multiples inclusion de fichiers.h. ne melange pas les choses

Bein si tu ve declarer tes variable dans un .h et les utiliser dans ton main; tu n'as pas besoin de les indiquer extern dans ton main ni de les declarer!!!!
elle sont deja connu par le main par l'intermédiare du #include calc.h c'est clair non!

Dailleurs que je sache quand tu utilse des bibliotheques par #include fichier.h tu ne t'amuse pas à declarer toutes les variable de fichier.h  en extern dans ton main! c'est les bases et c'est que je te repete depuis trois messages
Messages postés
165
Date d'inscription
samedi 4 juin 2005
Statut
Membre
Dernière intervention
24 octobre 2007

"Bein si tu ve declarer tes variable dans un .h et les utiliser dans ton main; tu n'as pas besoin de les indiquer extern dans ton main ni de les declarer!!!!"
Pour être poli, tu me les casses légérement : c'est ce que j'essai de faire, mais ca plante :)

"Dailleurs que je sache quand tu utilse des bibliotheques par #include fichier.h tu ne t'amuse pas à declarer toutes les variable de fichier.h en extern dans ton main! c'est les bases et c'est que je te repete depuis trois messages"
Merci de t'assurer de ma connaissance des bases, mtn inquiéte toi plutot de la tienne.
Il n'y a généralement pas de variable dans les headers (je ne parle pas des #define) ! Ensuite, et moi aussi je te le répéte depuis 3 messages, j'ai voulu faire ce que tu dis (déclarer les var ds le header et agir sur les variables ds les fichiers où est utilisé le header), seulement ca ne compile pas.
La solution que m'a apporté luhtor correspond tout à fait à mon attente, pas besoin de blablater plus.
Par ailleurs, arrête le débat sur extern, il n'a pas lui d'etre : extern m'a permit de contourner le prob (oufff un peu de mal non ?!!).
Bref, au plaisir.
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
On déclares pas de variable dans un .h ! c'est tout sauf si elle est précisée "static" ou "extern". Sinon le pb, c'est lorsque deux fichiers source vont inclure ton fichier .h, tu vas te retrouver avec l'erreur "multiple definition" ou l'erreur suivante sous VC:
error LNK2005: "int test" (?test@@3HA) already defined in XXX.obj

Bon pinailles pas sur le sens de compilation. C'est pas parce que je suis pas d'accord avec toi, qu'il faut que tu analyses mot par mot ce que j'écris.

Par ailleurs, je programme uniquement en C++ ce qui explique peut etre nos différents points de vues.

"Dailleurs que je sache quand tu utilse des bibliotheques par #include
fichier.h tu ne t'amuse pas à declarer toutes les variable de
fichier.h  en extern dans ton main! c'est les bases et c'est que je te
repete depuis trois messages"
=> Oui jsutement, car les variables sont déclarés dans un fichier source de la librairie et spécifié extern dans ton fichier .h donc nul besoin de les redéclarer.

"Imagine que dans chaque cpp tu as une fonction et la variable externe.
si tu ve comter le nombre de fois ou tu as appelé ces deux fonctions tu
as interet à incrementer la meme variable"
=> euh je te suis pas très bien la. Ces deux fonctions ? tu parles d'une seule au début. Puis au niveau de la structure, créer des liens entre des fichiers .cpp, je trouve pas ca terrible. Ca va quand, tu as trois fichiers qui se battent en duel. Mais quand t'as une centaine de fichiers à compiler, vive le bordel, si les fichiers commencent à se partager des variables.

Donc pour conclure, le test est simple:
Un header inclu dans deux fichiers sources créer une erreur de lien sauf si cette variable est déclaré:
- const
- static
- extern

Faudrait creuser la différence entre static et extern.