Comment ca marche les include...

Comment ca marche les include... - C++ - Programmation

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 ;)

Reply

Marsh Posté le 11-04-2003 à 14:28:09   

Reply

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


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 11-04-2003 à 14:31:13    

dans chaque .h
 
 

Code :
  1. #ifndef motif_decoratif_nomfichier_h
  2. #define motif_decoratif_nomfichier_h
  3. // tes definitions
  4. #endif

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

Reply

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 ??

Reply

Marsh Posté le 11-04-2003 à 17:12:54    

:heink:

Reply

Marsh Posté le 11-04-2003 à 17:15:31    


Ben oui je sais pas....

Reply

Marsh Posté le 11-04-2003 à 17:15:44    

Plait il Odile ? :heink:


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 11-04-2003 à 17:17:01    

Elle est pas clair ma question ?

Reply

Marsh Posté le 11-04-2003 à 17:18:24    

Non


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 11-04-2003 à 17:21:17    

tu dois mettre tes include uniquement là ou il y en a besoin.

Reply

Marsh Posté le 11-04-2003 à 17:21:17   

Reply

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 ;)

Reply

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


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 11-04-2003 à 17:27:36    

Oki merci Harko et désolé pour le dérangement

Reply

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

Reply

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

Reply

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.

Reply

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.

Reply

Marsh Posté le 12-04-2003 à 10:03:53    

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 ...)


---------------
last.fm
Reply

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 ...)

:heink: relis le topic

Reply

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

Reply

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
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


 
pipo pipo pipo  :sarcastic:


---------------
From now on, you will speak only when spoken to, and the first and last words out of your filthy sewers will be "Sir!"
Reply

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 :
  1. /*Header*/
  2. #ifndef X_H
  3. #define X_H
  4. class Y;
  5. class Point;
  6. class X
  7. {
  8.   private :
  9.     Y* pY;
  10.  
  11.   public :
  12.     X();
  13.     virtual ~X();
  14.     Point GetPoint();
  15.     void SetPoint(Point p);
  16.  
  17. };
  18. #endif


 
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...

Reply

Marsh Posté le 12-04-2003 à 16:31:19    

ce que je disais précédemment

Reply

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)

Reply

Marsh Posté le 12-04-2003 à 17:31:20    

gcc -E

Reply

Marsh Posté le 12-04-2003 à 19:05:18    

++Taz a écrit :

:heink: relis le topic


 
désolé ... Effectivement, j'ai lu en travers ... :jap:


---------------
last.fm
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed