Comment ca marche les include... - C++ - Programmation
Marsh Posté le 11-04-2003 à 14:30:07
Pour éviter les inclusions croisées, mettre ceci dans le .h:
#ifndef MON_FICHIER_H
#define MON_FICHIER_H
(...)
#endif
Marsh Posté le 11-04-2003 à 14:31:13
dans chaque .h
Code :
|
ca evite que le préprocessuer passe 2 fois
motif_decoratif, ca peut etre ton nom, la date, le nom du projet ou une combinaison. plus cet identifiant est unique, mieux c'est
Marsh Posté le 11-04-2003 à 17:10:43
Ok merci, j'avais oublié ca. Et en fait, je les met ou tous mes include : dans le .h ??
Marsh Posté le 11-04-2003 à 17:15:44
Plait il Odile ?
Marsh Posté le 11-04-2003 à 17:18:24
Non
Marsh Posté le 11-04-2003 à 17:21:17
tu dois mettre tes include uniquement là ou il y en a besoin.
Marsh Posté le 11-04-2003 à 17:22:16
Zut ! Désolé
Alors je repose :
Si dans une de mes classes j'ai besoin d'inclure machin, le include "machin.h", je le met dans le .cpp ou dans le .h ou dans les deux ?
J'espère que ca sera mieux cette fois
Marsh Posté le 11-04-2003 à 17:26:52
Ca dépend
Si tu fais référence à telle ou telle classe dans un fichier cpp, alors tu l'inclus dans ton fichier cpp.
A partir du moment ou dans un fichier tu fais référence à une classe déclarée ailleurs, tu dois inclure le .h correspondant, quel que soit le fichier ou tu te trouves
Marsh Posté le 11-04-2003 à 17:28:43
c'est à dire que si tes prototypes de ton .h n'ont pas besoin de "truc.h" mais que l'implementation a elle besoin de truc.h, il ne faut mettre l'include de "truc.h" que dans le .cpp et pas dans le .h
Marsh Posté le 11-04-2003 à 17:33:14
C'est ce que j'avais déduit Et en fait, le problème ne venait pas du manque de #ifnef(...) puisque VC++ me les avaient mis automatiquement...Va donc falloir que je me plonge dans mes include pour faire du rangement....
Merci les gars
Marsh Posté le 12-04-2003 à 09:39:17
Bizarre, on m'a toujours appris a faire le contraire..
Moi je met tous mes includes dans le .h
De toute facon ca change pas grand chose, du moment que dans ton implementation , tu fasse un include de ton fichier d'entete.
Marsh Posté le 12-04-2003 à 09:45:09
ça change énormément. si tu fais un include alors qu'il n'y en a pas besoin, c'est autant de travail supplémentaire pour le préprocesseur. et si le volume est important, template par exemple, ça fait exploser les temps de compilation pour rien(sérieusement, avec ce genre de truc, c'as pas rare de voir le préprocesseur qui crache un fichier de 1Mo, avec seulement 150Ko utile). et puis c'est aussi le principe de modularité: les include font partie de ton implémentation, ton utilisateur n'a pas besoin/ne doit pas disposer de la liste complète de toutes les bibliotheques que tu utilises ni des éventuels liens entre tes différents modules.
Marsh Posté le 12-04-2003 à 10:07:34
theShOcKwAvE a écrit : Et dans certains cas, on ne peut même pas se permettre de mettre l'include dans le .h (pour résodre des pbs d'includes circulaires ...) |
relis le topic
Marsh Posté le 12-04-2003 à 13:57:11
++Taz je suis bien d'accord avec toi, c debile d'inclure des trucs qui servent pas, mais moi quand je prog, mon implementation n'a qu'un seul include : celui du .h
les autres sont dans le .h
C'est aussi une question de clarté, histoire de pas se retrouver avec des includes partout n'importe comment
Marsh Posté le 12-04-2003 à 14:06:08
vince_223 a écrit : ++Taz je suis bien d'accord avec toi, c debile d'inclure des trucs qui servent pas, mais moi quand je prog, mon implementation n'a qu'un seul include : celui du .h |
pipo pipo pipo
Marsh Posté le 12-04-2003 à 14:42:13
Lorsqu'une donnée membre, un paramètre ou un retour de fonction est de type pointeur, le #include n'est pas nécessaire, de même pour les arguments ou les retours passés par valeur dans un header.
Dans le fichier .cpp, le 1er #include doit être celui qui correspond à l'implémentation.
Code :
|
Si on met '#include "Y.h"', on provoque un copier-coller de ce fichier à chaque lecture du fichier X.h , ce qui peut vite être coûteux...
Marsh Posté le 12-04-2003 à 17:17:52
ok
C vrai qu'en faisant cela, ca fait une copie
Autant pour moi... j'aurai apris quelque chose.
justement si y'a quelqu'un qui veut bien m'expliquer le fonctionnement des includes avec le preprocesseur plus en detail, je suis carrement preneur, car apparament, j'ai des lacunes dans ce domaine. (ou un cours la dessus)
Marsh Posté le 12-04-2003 à 19:05:18
++Taz a écrit : relis le topic |
désolé ... Effectivement, j'ai lu en travers ...
Marsh Posté le 11-04-2003 à 14:28:09
Ben voila, c'est tout con, je sais plus comment il faut faire mes include dans des classes.
Au départ, j'étais parti en mettant les include dans les fichiers .cpp et ca marchait à peu près. (Sauf des fois ou apparemment je devais mettre également l'include dans le .h pour que ca marche...)
La j'en suis à un point ou j'ai des inclusions croisées :
inclusion d'une classe view dans une classe document
et dans cette classe view, inclusion du document...Et la je suis tout perdu, ca marche plus au niveau des includes...
Alors comment c'est y qui faut que je fasses ?
Si vous avez besoin de plus d'info, je mettrais mon code, demandez si besoin Merci
PS : J'ai fait un iut info il y a quelques temps, alors n'hésitez pas à vous moquer