Explication sur les .h et .cpp

Messages postés
15
Date d'inscription
dimanche 1 août 2004
Statut
Membre
Dernière intervention
28 avril 2008
- - Dernière réponse : 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
Afficher la suite 

13 réponses

Messages postés
6
Date d'inscription
lundi 5 juillet 2004
Statut
Membre
Dernière intervention
3 février 2006
0
Merci
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
Commenter la réponse de AlphaLyrae
Messages postés
115
Date d'inscription
samedi 20 décembre 2003
Statut
Membre
Dernière intervention
23 août 2008
1
0
Merci
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!
Commenter la réponse de Rouliann
Messages postés
15
Date d'inscription
dimanche 1 août 2004
Statut
Membre
Dernière intervention
28 avril 2008
0
Merci
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
Commenter la réponse de juju0169
Messages postés
115
Date d'inscription
samedi 20 décembre 2003
Statut
Membre
Dernière intervention
23 août 2008
1
0
Merci
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!
Commenter la réponse de Rouliann
Messages postés
15
Date d'inscription
dimanche 1 août 2004
Statut
Membre
Dernière intervention
28 avril 2008
0
Merci
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"
????
Commenter la réponse de juju0169
Messages postés
115
Date d'inscription
samedi 20 décembre 2003
Statut
Membre
Dernière intervention
23 août 2008
1
0
Merci
nan je comprends pas pourquoi ça ne marche pas ... :-/ dzl....

____________________
**Rouliann**
Life is short, program more!
Commenter la réponse de Rouliann
Messages postés
15
Date d'inscription
dimanche 1 août 2004
Statut
Membre
Dernière intervention
28 avril 2008
0
Merci
ok merci quand meme
Commenter la réponse de juju0169
Messages postés
549
Date d'inscription
samedi 6 septembre 2003
Statut
Membre
Dernière intervention
6 mars 2010
0
Merci
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...
Commenter la réponse de cs_Matt67
Messages postés
549
Date d'inscription
samedi 6 septembre 2003
Statut
Membre
Dernière intervention
6 mars 2010
0
Merci
un oubli dans la derniere phrase :

[../..]

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


Matt...
Commenter la réponse de cs_Matt67
Messages postés
15
Date d'inscription
dimanche 1 août 2004
Statut
Membre
Dernière intervention
28 avril 2008
0
Merci
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)
Commenter la réponse de juju0169
Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
8
0
Merci
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.
Commenter la réponse de ymca2003
Messages postés
6
Date d'inscription
lundi 5 juillet 2004
Statut
Membre
Dernière intervention
3 février 2006
0
Merci
"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
Commenter la réponse de AlphaLyrae
Messages postés
15
Date d'inscription
dimanche 1 août 2004
Statut
Membre
Dernière intervention
28 avril 2008
0
Merci
Ok merci a tous pour ces precisions .
Commenter la réponse de juju0169