Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Avis sur les includes files

59 réponses
Avatar
Gégé
Salut,

Dans mon projet, j'ai cr=E9e un global.h qui contient tous les includes
des librairies annexes que j'utilise.
Du coup je mets ce global.h dans l'ent=EAte de mes classes ( qui
n'utilisent pas n=E9cessairement toutes les librairies =E0 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 =E9tait de ne pas copier / coller des tonnes de
#include dans chaque .h

10 réponses

1 2 3 4 5
Avatar
Jean-Marc Bourguet
Gégé writes:

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
Avatar
Gégé
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
Avatar
Jean-Marc Bourguet
Gégé writes:

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
Avatar
Fabien LE LEZ
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 :-(
Avatar
Gégé
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?
Avatar
Gégé
les réponses à mes questions sont traités ici
http://cpp.developpez.com/faq/cpp/?page=namespace
http://www.eventhelix.com/realtimemantra/HeaderFileIncludePatterns.htm

merci
Avatar
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 ...".

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
Avatar
espie
In article <49857132$0$9397$,
Etienne Rousee wrote:
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.
Avatar
Fabien LE LEZ
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.
Avatar
Mickaël Wolff
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 <http://lupusmic.org/pro/>
1 2 3 4 5