Explication sur les .h et .cpp

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

Messages postés
6
Date d'inscription
lundi 5 juillet 2004
Statut
Membre
Dernière intervention
3 février 2006

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
Messages postés
115
Date d'inscription
samedi 20 décembre 2003
Statut
Membre
Dernière intervention
23 août 2008
1
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!
Messages postés
15
Date d'inscription
dimanche 1 août 2004
Statut
Membre
Dernière intervention
28 avril 2008

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
Messages postés
115
Date d'inscription
samedi 20 décembre 2003
Statut
Membre
Dernière intervention
23 août 2008
1
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!
Messages postés
15
Date d'inscription
dimanche 1 août 2004
Statut
Membre
Dernière intervention
28 avril 2008

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"
????
Messages postés
115
Date d'inscription
samedi 20 décembre 2003
Statut
Membre
Dernière intervention
23 août 2008
1
nan je comprends pas pourquoi ça ne marche pas ... :-/ dzl....

____________________
**Rouliann**
Life is short, program more!
Messages postés
15
Date d'inscription
dimanche 1 août 2004
Statut
Membre
Dernière intervention
28 avril 2008

ok merci quand meme
Messages postés
549
Date d'inscription
samedi 6 septembre 2003
Statut
Membre
Dernière intervention
6 mars 2010

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...
Messages postés
549
Date d'inscription
samedi 6 septembre 2003
Statut
Membre
Dernière intervention
6 mars 2010

un oubli dans la derniere phrase :

[../..]

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


Matt...
Messages postés
15
Date d'inscription
dimanche 1 août 2004
Statut
Membre
Dernière intervention
28 avril 2008

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)
Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
8
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.
Messages postés
6
Date d'inscription
lundi 5 juillet 2004
Statut
Membre
Dernière intervention
3 février 2006

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

Ok merci a tous pour ces precisions .