Explication sur les .h et .cpp

juju0169 Messages postés 15 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 28 avril 2008 - 8 mai 2005 à 15:18
juju0169 Messages postés 15 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 28 avril 2008 - 11 mai 2005 à 14:02
Bonjour a tous!

J'ai encore un ptit probleme. Voila je m'explique.

J'ai creer un project avec :
Fichier_principal.cpp,
Fichier_secondaire1.cpp,
Fichier_secondaire2.cpp

et un fichier.h (ou je mets toutes les declarations des fonctions qu'elles soient pour le Fichier_principal.cpp, ou les deux autres).

Juste qu'a aujourd'hui je mettais en haut des 3 .cpp #include "fichier.h"

et ca marche mais mon probleme c'est qu'alors visual me dis que tous ce qui se trouve dans le .h a deja été defini
(warning LNK4006: int XXXX already defined ) et donc j'ai plein de warning.

je comprends bien que de mettre plusieur fois #include "fichier.h"
visual se retrouve 3 fois avec les memes declarations.

Alors une idee

13 réponses

AlphaLyrae Messages postés 6 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 3 février 2006
8 mai 2005 à 16:24
Il faut utiliser "extern" :
Tu déclares ta variable comme ca dans fichier.h :
extern int prout;
pour dire que c'est une variable qui sera accessible à tout le monde
et tu la declares réellement une fois dans un des fichiers cpp
int prout;

Tu fais ca pour chaque variable et ca devrait bien tourner.

PS : surtout pas de merci à l'aide de visual C++ sur extern parce que à l'époque j'avais bien galéré à comprendre comment ca marche
0
Rouliann Messages postés 115 Date d'inscription samedi 20 décembre 2003 Statut Membre Dernière intervention 23 août 2008 1
8 mai 2005 à 16:26
rajoute



#ifndef _fichier_h

#define _fichier_h




au début de fichier.h et met à la fin



#endif



Tcho ;)



____________________
**Rouliann**
Life is short, program more!
0
juju0169 Messages postés 15 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 28 avril 2008
8 mai 2005 à 18:09
Attendez si j'ai bien compris

dans mon fichier.h
je met extern devant toutes mes variables, mes declarations de fonctions et mes structures (mais il me semble que devant struct on ne peut pas mettre extern (a voir))

puis apres j'ai un doute

je dois mettre #include "fichier.h" dans les trois fichiers .cpp
ou juste dans un seul???

et puis quand je veux me servir d'une variable globale definie dans mon fichier.h (exemple extern int nombre=0) je met int nombre ???

merci de pour vos reponses car 32 warning ca fait pas tres propre
0
Rouliann Messages postés 115 Date d'inscription samedi 20 décembre 2003 Statut Membre Dernière intervention 23 août 2008 1
8 mai 2005 à 18:13
Moi je n'utilise pas extern et je peux inclure mes headers dans chacuns
de mes fichiers .cpp sans générer aucun warning... je pense qu'il est
plus facile de rajouter 3 lignes de code dans ton fichier .h plutot que
de rajouter extern devant chaque déclaration. Mais c'est à toi de voir
;)

____________________
**Rouliann**
Life is short, program more!
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
juju0169 Messages postés 15 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 28 avril 2008
8 mai 2005 à 20:00
Rouliann j'ai bien fais comme t'as dis j'ai mis dans mon fichier.h


#ifndef _fichier_h

#define _fichier_h

#endif

mais ça me laisse les erreurs de redefiniton des globales et des fonctions.

Est ce parceque dans mles trois fichier.cpp je met #include "fichier.h"
????
0
Rouliann Messages postés 115 Date d'inscription samedi 20 décembre 2003 Statut Membre Dernière intervention 23 août 2008 1
8 mai 2005 à 20:02
nan je comprends pas pourquoi ça ne marche pas ... :-/ dzl....

____________________
**Rouliann**
Life is short, program more!
0
juju0169 Messages postés 15 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 28 avril 2008
8 mai 2005 à 20:20
ok merci quand meme
0
cs_Matt67 Messages postés 549 Date d'inscription samedi 6 septembre 2003 Statut Membre Dernière intervention 6 mars 2010 3
8 mai 2005 à 20:55
Bonsoir,



Je pense qu'il est déconseillé de mettre des variables dans des fichiers .h

D'abord, j'opte pour un .cpp il faut un .h donc pour toi, 3 .cpp = 3 .h
car comme ca tes fonctions sont réutilisables et pour des gros projets,
si tu changes un prototype, tu ne recompile pas tout tes fichiers.

Puis faire comme Rouliann a dit pour eviter les inclusions multiples.

#ifndef TOTO_H

#define TOTO_H

// ici tes prototypes de fonctions

#endif

enfin, si tu as des variables globales à plusieurs fichiers, dans le
fichier principal (ou un autre), tu la declares normalement et tu
l'initialises : int g_ntoto = 0;

puis dans les fichiers ou tu t'en sers tu met int g_ntoto;

Matt...
0
cs_Matt67 Messages postés 549 Date d'inscription samedi 6 septembre 2003 Statut Membre Dernière intervention 6 mars 2010 3
8 mai 2005 à 20:57
un oubli dans la derniere phrase :

[../..]

puis dans les fichiers ou tu t'en sers tu met : extern int g_ntoto;


Matt...
0
juju0169 Messages postés 15 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 28 avril 2008
8 mai 2005 à 21:00
ok je vais voir ca

mais dans mon .h j'avais mis des structures qui me servent dans les trois fichier .cpp

alors je les decalres ou maintenant (juste dans un des cpp)
0
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
10 mai 2005 à 09:36
voici ce que tu peux mettre dans les .h :
- les déclarations de structures, classes, typedef, enum.
- les #define
- les prototypes de fonctions (ou déclaration).

voici ce qu'il ne faut pas mettre :
- les implémentations des fonctions (le code).
- les déclarations de variables (sauf celles avec extern).

mettre #ifdef/#define/#endif dans un .h évite que celui-ci soit inclu plusieurs fois lors de la compilation d'UN fichier source. Si plusieur fichiers sources incluent le .h il sera inclu une seule fois par chaque mais au final il y aura plusieurs fois le contenu des fichiers .h dans le code généré. C'est pour cela qu'il ne doit pas y avoir de code dans les .h.

En ce qui concerne les variables. Elles ne doivent apparaître en tant que variable globale UNE seule fois dans tout le projet et donc il ne faut pas les mettre dans les .h (la variable se trouverait dupliquée x fois). Pour pouvoir utiliser la variable dans des fichiers sources séparés, UN doit avoir la déclaration (et son init éventuelle) et les AUTRES la même chose (sans l'init) avec extern.

Pour éviter d'avoir à déclarer extern toutes les var globales dans les fichiers sources il est possible de mettre la déclaration avec extern dans le .h.
0
AlphaLyrae Messages postés 6 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 3 février 2006
10 mai 2005 à 14:30
"lors de la compilation d'UN fichier source"

waaou ! merci beaucoup ! Je viens enfin de comprendre pourquoi le .h etait inclu plusieurs fois même avec les #define
0
juju0169 Messages postés 15 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 28 avril 2008
11 mai 2005 à 14:02
Ok merci a tous pour ces precisions .
0
Rejoignez-nous