Avis sur les includes files

Le
Gégé
Salut,

Dans mon projet, j'ai crée un global.h qui contient tous les includes
des librairies annexes que j'utilise.
Du coup je mets ce global.h dans l'entête de mes classes ( qui
n'utilisent pas nécessairement toutes les librairies à la fois ).

Question : Est-ce qu'il vaut mieux mettre les #include au cas par cas
dans chaque header de les classes ? ( Et pourquoi ? )

Merci
G

ma principale motivation était de ne pas copier / coller des tonnes de
#include dans chaque .h
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 6
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Jean-Marc Bourguet
Le #18543151
Gégé
Question : Est-ce qu'il vaut mieux mettre les #include au cas par cas
dans chaque header de les classes ? ( Et pourquoi ? )



Oui. Parce que ce que tu fais augmente le couplage entre tes classes, tu
modifies un fichier et tu dois tout recompiler. Tu utilises un entête
quelque part, et tu dois fournir tous ceux inutilement inclus.

Idéalement, il faudrait que chaque entête soit autosuffisant: qu'il
contienne ce qu'il faut pour pouvoir être inclus en premier (et rien
d'autre). Une technique pour s'en assurer est de faire en sorte que chaque
entête soit le premier fichier inclus dans au moins une unité de
compilation, celle qui défini les fonctions qui y sont déclarées.

L'utilisation des entêtes précompilés change un peu la donne par rapport à
cette situation, mais je manque trop d'expérience en la matière pour
pouvoir donner des conseils.

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org
Gégé
Le #18544171
Typiquement j'utilise massivement

#include<string>
using namespace std;

Dois-je le mettre dans chaque header?
Ou y t-il une subtilité ?

Merci pour d'avance

G
Jean-Marc Bourguet
Le #18544611
Gégé
Typiquement j'utilise massivement

#include<string>
using namespace std;

Dois-je le mettre dans chaque header?



De mon point de vue, il ne faut jamais mettre de directive using namespace
dans les entêtes: on se retrouve à les imposer à tous les clients de
l'entête qui peuvent avoir de bonnes raisons de ne pas les vouloir.

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org
Fabien LE LEZ
Le #18544821
On Sat, 31 Jan 2009 19:09:42 +0100, Jean-Marc Bourguet

De mon point de vue, il ne faut jamais mettre de directive using namespace
dans les entêtes: on se retrouve à les imposer à tous les clients de
l'entête qui peuvent avoir de bonnes raisons de ne pas les vouloir.



Et en prime, on se retrouve avec un "using" actif, sans le voir
puisqu'il est "caché" dans le .h :-(
Gégé
Le #18547621
Du coup dans la déclaration de mes fonctions il faut que j'utilise
std::string ; et dans le cpp je mets un using namespace?
Etienne Rousee
Le #18548441
Gégé a écrit :
Du coup dans la déclaration de mes fonctions


>il faut que j'utilise std::string ;

"string" seulement, si dans le cpp, tu mets le
"using namespace std;" avant le "#include ...".

et dans le cpp je mets un using namespace?



Oui, si tu veut éviter le "std::" et que tu ne
prévois pas de problèmes de conflits de noms.

--

Etienne
espie
Le #18548791
In article Etienne Rousee
Gégé a écrit :
Du coup dans la déclaration de mes fonctions


>il faut que j'utilise std::string ;

"string" seulement, si dans le cpp, tu mets le
"using namespace std;" avant le "#include ...".



Mauvais conseil, tres mauvais conseil.

Un fichier d'entetes qui depend de facon aussi directe de la maniere
dont il est inclus, c'est une excellente recette pour trouver les emmerdes.
Fabien LE LEZ
Le #18548951
On Sun, 1 Feb 2009 10:41:30 +0000 (UTC), (Marc Espie):

Un fichier d'entetes qui depend de facon aussi directe de la maniere
dont il est inclus, c'est une excellente recette pour trouver les emmerdes.



Yep. Un en-tête doit être autosuffisant, tout en ayant aussi peu
d'effets secondaires que possible.

Donc :

- dans un .h, écrire systématiquement std::string, etc., et ne pas
utiliser "using namespace" ni "using std::string".

- dans un .cpp, tu peux, si tu y tiens vraiment, écrire
"using namespace std" après le dernier #include.
Je me contente quant à moi d'introduire uniquement les noms que
j'utilise beaucoup dans ce .cpp. Par exemple :
using std::string;
using std::vector;

Ces règles obligent à écrire "std::" un peu plus souvent que tu le
voudrais, mais évite bien des emmerdes.
Mickaël Wolff
Le #18549181
Fabien LE LEZ a écrit :
- dans un .h, écrire systématiquement std::string, etc., et ne pas
utiliser "using namespace" ni "using std::string".



Et en utilisant la technique des namespaces anonymes ça te dérange
aussi ?

namespace projet
{
namespace {
using std::string ;

class machin
{
protected:
string nom ;

//...
} ;
}
}

Ça permet d'éviter la pollution du namespace global tout en
permettant d'éviter de rendre le code trop lourd à la lecture.

--
Mickaël Wolff aka Lupus Michaelis
http://lupusmic.org

Seeking for a position
Publicité
Poster une réponse
Anonyme