OVH Cloud OVH Cloud

[debutant] directive include

16 réponses
Avatar
Bruno CAUSSE
Bonjour,

Est il correcte de placer les directives #include après les "ifndef" dans
les fichiers d'entete?

Existe t'il une convention d'écriture de code?

Supplement :-) : Pourquoi puis je utiliser std::string sans directive
#include<string> (compilo gcc)?

10 réponses

1 2
Avatar
Fabien LE LEZ
On Mon, 23 May 2005 11:31:10 +0200, Bruno CAUSSE :

Est il correcte de placer les directives #include après les "ifndef" dans
les fichiers d'entete?


Oui : ça permet de n'avoir pas à ouvrir ces fichiers #inclus
inutilement.

Existe t'il une convention d'écriture de code?


Sur ce point ? Je ne sais pas, mais quant à moi, j'écris toujours le
#ifndef/#define au tout début du .h, et le #endif correspond à la fin.
Seuls des commentaires ont le droit de ne pas se trouver entre les
deux.

Pourquoi puis je utiliser std::string sans directive
#include<string>


Il est peut-être inclus indirectement ?

(compilo gcc)?


Quelle version ?

Avatar
Jean-Marc Bourguet
Bruno CAUSSE writes:

Bonjour,

Est il correcte de placer les directives #include après les "ifndef" dans
les fichiers d'entete?


Si tu parles des gardes d'inclusion, oui. Sinon, je ne comprends pas
la question.

Existe t'il une convention d'écriture de code?

Supplement :-) : Pourquoi puis je utiliser std::string sans directive
#include<string> (compilo gcc)?


Tu inclus un autre en-tete qui inclus <string>, ce qui est autorise
mais pas obligatoire, donc tu vas manquer de portabilite, peut-etre
meme a une autre version de gcc.

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
Bruno CAUSSE
dans l'article , Fabien LE LEZ à
a écrit le 23/05/05 11:43 :

Est il correcte de placer les directives #include après les "ifndef" dans
les fichiers d'entete?


Oui : ça permet de n'avoir pas à ouvrir ces fichiers #inclus
inutilement.


Donc dans le fichier XXXX.cpp je ne repete pas les includes apres #include
"XXXX.h"


Existe t'il une convention d'écriture de code?


Sur ce point ? Je ne sais pas, mais quant à moi, j'écris toujours le
#ifndef/#define au tout début du .h, et le #endif correspond à la fin.
Seuls des commentaires ont le droit de ne pas se trouver entre les
deux.

Pourquoi puis je utiliser std::string sans directive
#include<string>


Il est peut-être inclus indirectement ?



Alors ds <iostream> seul fichier #inclus

"Fainéant " :-) : comment visualiser le contenu de ces fichiers.

(compilo gcc)?


Quelle version ?
3.3



Avatar
Fabien LE LEZ
On Mon, 23 May 2005 11:55:50 +0200, Bruno CAUSSE :

"Fainéant " :-) : comment visualiser le contenu de ces fichiers.


Ben... Chez moi, c'est clic droit -> Textpad.
Ou, quand je suis dans l'IDE de BC++ 5.02, Ctrl+O puis a.

Avatar
Bruno CAUSSE
dans l'article , Fabien LE LEZ à
a écrit le 23/05/05 12:08 :

Ben... Chez moi, c'est clic droit -> Textpad.
Ou, quand je suis dans l'IDE de BC++ 5.02, Ctrl+O puis a.


Bon ok :-) je vais chercher. Chez moi c'est Xcode 1.5 ;-)

Avatar
Michel Michaud
Dans le message BEB77546.4106%,
dans l'article , Fabien
LE LEZ à a écrit le 23/05/05 11:43 :

Est il correcte de placer les directives #include après les
"ifndef" dans les fichiers d'entete?


Oui : ça permet de n'avoir pas à ouvrir ces fichiers #inclus
inutilement.


Donc dans le fichier XXXX.cpp je ne repete pas les includes apres
#include "XXXX.h"


Après ? Peut-être, voir plus loin.



Existe t'il une convention d'écriture de code?




Je crois que la plupart des programmeurs C++ respectent la règle qui
dit qu'un fichier d'en-tête doit être complet, donc contenir les
#include qui sont nécessaires pour le code qu'il contient. Donc on
devrait pouvoir compiler un fichier source qui ne fait qu'un include
sur ce fichier.

Par contre, dans un fichier source, on ne compte pas sur un #include
pour inclure accidentellement les autres #include dont on a vraiment
besoin : si le fichier source utilise des string par exemple, on
inclura explicitement <string> même si on a déjà inclus un autre
fichier qui l'a (peut-être) inclus.

[...]
Pourquoi puis je utiliser std::string sans directive
#include<string>


Il est peut-être inclus indirectement ?



Alors ds <iostream> seul fichier #inclus


Peut-être, mais tu devrais quand même faire le #include sur string
explicitement... Un autre compilateur ou une autre version du
compilateur pourrait ne pas faire inclure <string> par iostream.


"Fainéant " :-) : comment visualiser le contenu de ces fichiers.


Tu ne veux pas te fier là-dessus pour décider des includes à faire...
En principe, <iostream> n'est peut-être pas un fichier et n'est
peut-être pas visualisable...

--
Michel Michaud
http://www.gdzid.com
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/



Avatar
Bruno CAUSSE
dans l'article 0plke.2182$, Michel Michaud à
a écrit le 23/05/05 16:03 :

Je crois que la plupart des programmeurs C++ respectent la règle qui
dit qu'un fichier d'en-tête doit être complet, donc contenir les
#include qui sont nécessaires pour le code qu'il contient. Donc on
devrait pouvoir compiler un fichier source qui ne fait qu'un include
sur ce fichier.



bon regle 1 : c'est clair. Ex : Un include utile seulement dans le cpp est
inclus dans l'entete, apres le ifndef....

Par contre, dans un fichier source, on ne compte pas sur un #include
pour inclure accidentellement les autres #include dont on a vraiment
besoin : si le fichier source utilise des string par exemple, on
inclura explicitement <string> même si on a déjà inclus un autre
fichier qui l'a (peut-être) inclus.


Heu... regle 2 : moins clair. En supplement (complement) de la regle 1

Peut-être, mais tu devrais quand même faire le #include sur string
explicitement... Un autre compilateur ou une autre version du
compilateur pourrait ne pas faire inclure <string> par iostream.


Ok.

Avatar
Marc Boyer
In article <BEB7B84F.414F%, Bruno CAUSSE wrote:
dans l'article 0plke.2182$, Michel Michaud à
a écrit le 23/05/05 16:03 :

Je crois que la plupart des programmeurs C++ respectent la règle qui
dit qu'un fichier d'en-tête doit être complet, donc contenir les
#include qui sont nécessaires pour le code qu'il contient. Donc on
devrait pouvoir compiler un fichier source qui ne fait qu'un include
sur ce fichier.


bon regle 1 : c'est clair. Ex : Un include utile seulement dans le cpp est
inclus dans l'entete, apres le ifndef....


Non, non: si un include n'est nécessaire que pour le cpp,
il est dans le cpp.

Je pense que ce que Michel veut te dire, c'est qu'on écrit

#ifndef TOTO_HPP
#define TOTO_HPP
#include <string>
struct foo {
std::string s;
];
#endif

Comme pour compiler la /signature/ de foo, il faut string,
c'est le module toto qui se charge de l'inclure, on demande
pas à l'utilisateur de faire un #include <string> s'il veut
faire #include "toto.hpp".

Après, si toto.cpp a besoin de map, c'est toto.cpp qui fait
#include <map>, pas toto.hpp.

Par contre, dans un fichier source, on ne compte pas sur un #include
pour inclure accidentellement les autres #include dont on a vraiment
besoin : si le fichier source utilise des string par exemple, on
inclura explicitement <string> même si on a déjà inclus un autre
fichier qui l'a (peut-être) inclus.


Heu... regle 2 : moins clair. En supplement (complement) de la regle 1


Si dans mon module titi, j'utilise foo (de toto) et des
std::string, je fais un #include de toto.hpp et de string.

Marc Boyer
--
Je ne respecte plus le code de la route à vélo depuis une double fracture
due au fait que j'étais le seul à le respecter.


Avatar
Bruno CAUSSE
dans l'article d6sqk8$jrp$, Marc Boyer à
a écrit le 23/05/05 16:50 :

Non, non:


Bon deuxieme essai :-)

Dans hpp tout les includes necessaires au hpp. (apres #ifndef)

Dans cpp tout les includes necessaires au cpp sauf ceux du hpp
correspondant.

Avatar
Marc Boyer
Bruno CAUSSE wrote:
dans l'article d6sqk8$jrp$, Marc Boyer à
a écrit le 23/05/05 16:50 :

Non, non:


Bon deuxieme essai :-)

Dans hpp tout les includes necessaires au hpp. (apres #ifndef)


Oui, ni plus, ni moins.

Dans cpp tout les includes necessaires au cpp sauf ceux du hpp
correspondant.


Exactement. Chaque chose à sa place.

Marc Boyer
--
Je ne respecte plus le code de la route à vélo depuis une double fracture
due au fait que j'étais le seul à le respecter.


1 2