[C++] include et redefinition de type

include et redefinition de type [C++] - C++ - Programmation

Marsh Posté le 11-11-2006 à 15:05:09    

Cela fait quelques mois que j'étudie le C++, je m'en sort plutot bien en général...
Mais il y a une chose que je n'arrive pas à gérer et qui me fait perdre énormément de temps, les #include.
 
Lorsque je suis sur un projet qui comprend de multiples classes (et donc beaucoup de #include...) je me retrouve sans arrêt avec des erreurs de redefinition de type lors de la compilation avec Visual Studio.
 
Je sais parfaitement à quoi sont du ces erreurs...  
 
Dans mon projet actuel j'ai créé une classe chaine (qui se substitue à la classe string, pour des raisons pédagogiques). Je dois donc faire un #include "chaine.h" dans toutes mes classes qui utilisent chaine. Le problème c'est que quand deux classes autres que chaine contiennent des chaine (donc un #include "chaine.h" ) et en plus qu'une des deux fait un include de l'autre je me retrouve avec une erreur de redefinition de la classe chaine, ce qui est normal..... mais comment gérer cela efficacement dans un projet plus complexe ? existe-t-il une instruction spécifique dont j'ignorerais l'existence ?


Message édité par koktel75 le 11-11-2006 à 15:06:31
Reply

Marsh Posté le 11-11-2006 à 15:05:09   

Reply

Marsh Posté le 11-11-2006 à 15:32:12    

dans tes hpp, par exemple ton chaine.hpp :  

Code :
  1. #ifndef CHAINE_H
  2. #define CHAINE_H
  3. //des includes si necessaire...
  4. //definition de la classe
  5. class chaine {
  6. };
  7. #endif


 
Tu appliques ce principe dans chacun de tes hpp de définition de classe, et grâce à ça, si le fichier a déjà été inclu, il ne le sera pas une deuxième fois si tu fais un 2ème appel à #include "le_fichier_concerné"
 
D'ailleurs à ce sujet j'ai une question, j'ai lu que la directive #pragma once permettait d'avoir le même comportement que ce que j'ai décrit ci-dessus, mais comme je l'ai pas vu souvent dans différent source, j'me demande si c'était quelque chose qui était standard ou pas ?

Reply

Marsh Posté le 11-11-2006 à 16:57:09    

standard pour visual studio... après est-ce que ca marche avec d'autre compilateur - je ne sais... si quelqu'un sait merci de nous éclairer

Reply

Marsh Posté le 11-11-2006 à 18:05:49    

J'avais effectivement entendu parler de #ifndef mais je ne savais pas qu'il fallait que je le mette dans la classe que je serais eventuellement emmené a tenté de redefinir. Donc dans ce cas la classe chaine. Je m'entetais à essayer de le caser dans les autres classes... pffff  
 
Bon en tout cas Merci cOwbOy !!!
 
Comme tu t'en doute je ne pourrais pas beaucoup t'aider concernant la directive #pragma once...

Reply

Marsh Posté le 11-11-2006 à 19:18:15    

koktel75 a écrit :

J'avais effectivement entendu parler de #ifndef mais je ne savais pas qu'il fallait que je le mette dans la classe que je serais eventuellement emmené a tenté de redefinir. Donc dans ce cas la classe chaine. Je m'entetais à essayer de le caser dans les autres classes... pffff  
 
Bon en tout cas Merci cOwbOy !!!
 
Comme tu t'en doute je ne pourrais pas beaucoup t'aider concernant la directive #pragma once...


 
Tu peux le mettre dans toute tes classes, c'est une habitude à adopter :)
 
En adaptant au nom de la classe bien sur ;)

Reply

Marsh Posté le 11-11-2006 à 20:26:36    

c0wb0y a écrit :

j'ai lu que la directive #pragma once ... j'me demande si c'était quelque chose qui était standard ou pas ?


Une #pragma est par définition non standard, ce qui ne veut pas dire qu'elle ne soit pas largement supportée. Voir les errements drolatiques de gcc, RMS, FSF & co pour savoir si oui ou non ya bon #pragma once.

Reply

Marsh Posté le 12-11-2006 à 00:33:01    

Merci des renseignements  :jap:

Reply

Marsh Posté le 13-11-2006 à 11:35:38    

papangue a écrit :

standard pour visual studio... après est-ce que ca marche avec d'autre compilateur - je ne sais... si quelqu'un sait merci de nous éclairer


 
Oui c'est standard.
 
ifndef est une contraction de "If ! defined"
 
par contre, pragma once n'est pas standard

Reply

Sujets relatifs:

Leave a Replay

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