[C/C++] Utilisation de "using namespace std;"

Le côté programmation du développement d'un jeu vidéo.

Utilisation de "using namespace std;"

Messagepar Gavos » 12 Fév 2010, 18:19

Hej hej,

Il semble y avoir deux écoles quand il s'agit d'utiliser le namespace std (le namespace de la librairie standard du C++, ou STL). Certains vont utiliser la directive using namespace std;, et d'autres vont spécifier std:: devant chaque utilisation d'un type de la STL.

Les premiers le font évidemment pour des raisons de clarté du code; selon l'utilisation qu'on a de la STL dans un fichier source, on peut se retrouver avec énormément de std:: qui polluent le codent. Les seconds trouvent que si on utilise systématiquement la directive using, on perd de l'intérêt d'utiliser les namespaces puisqu'on ne les écrit pas explicitement. À savoir qu'on perd la possibilité de pouvoir préciser dans quel "univers" on veut choisir la fonction quand on l'appelle.

Je suis plutôt partisan du using namespace std; car je décide que je ne définierai jamais mes propres conteneurs/strings/etc. ou alors je les nommerais différemment... ce que les namespaces évitent justement d'avoir à faire, mais je pars du principe qu'une list c'est une liste de la std et ce ne sera jamais autre chose. Si j'ai besoin d'une liste différente - disons une liste moins complète mais plus légère - je ne vais refléter cette idée dans le nommage : light_list me semble alors plus approprié que gavos::list.

Mais j'aimerais savoir si certains parmi vous ont eu des mauvaises surprises avec cette solution. Est-ce qu'à un moment ou à un autre on regrette d'avoir fait ce choix ? Ou bien est-ce que les "anti-using namespace" le sont juste par purisme ?
Gavos
 
Messages: 1076
Inscription: 19 Mar 2005, 13:00

Messagepar Kristof » 12 Fév 2010, 18:30

Je fais partie de la troisième école, ceux qui utilisent pas.
(car sur des gros projets, j'ai toujours vu les namespace mener a des arrachages de cheveux).
Mais bon, je suis un réfractaire au progrès :)
Avatar de l’utilisateur
Kristof
Hello World, I'm new !
 
Messages: 645
Inscription: 14 Avr 2005, 11:56
Localisation: Montigny le Bretonneux (78)

Messagepar Atréides » 12 Fév 2010, 18:49

Quatrième école : ceux qui mettent "using namespace std" dans un .hpp :p

Moi, je préfère utiliser using namespace. Je n'ai jamais eu le moindre problème avec, il suffit juste de ne pas faire n'importe quoi.

J'avais prévu de dire plus de choses, mais le journal de carnaval vient d'arriver.
Souvent présent sur #gcn, irc.langochat.net
Site web : seuret . com (programmation, biostatistiques, CP Explo 2/1)
Avatar de l’utilisateur
Atréides
 
Messages: 1349
Inscription: 13 Mar 2005, 13:12
Localisation: Suisse

Messagepar Gavos » 12 Fév 2010, 18:57

Je fais partie de la troisième école, ceux qui utilisent pas.

Tu veux dire que tu n'utilises pas non plus la STL (vu qu'utiliser la STL implique l'utilisation de son namespace :)) ? Ceci dit je serais très intéressé de savoir quel genre de problème tu avais vu avec les namespaces, je pense que l'utilisation que j'en ai fait jusqu'à présent a dû être assez simpliste...

Quatrième école : ceux qui mettent "using namespace std" dans un .hpp :p

Ça pour le coup je ne suis pas forcément pour, ça oblige les utilisateurs de ton header à utiliser la 1ère école... Enfin si ce n'est pas destiné à être utilisé par d'autres, tu fais bien ce que tu veux :) Mais quand tu dis "il suffit de ne pas faire n'importe quoi", tu penses à quoi en particulier ?
Gavos
 
Messages: 1076
Inscription: 19 Mar 2005, 13:00

Messagepar Mokona » 12 Fév 2010, 23:39

Les problèmes potentiels d'un using namespace std; (ou autres) au top-level d'un cpp qui me viennent à l'esprit :

* perturbe l'utilisation de la compilation via des blobs ;
* si toi, tu appelle simple_list plutôt que gavos::list, ce n'est pas forcément le cas d'une lib que tu vas devoir inclure.

Dans mon cas, ne pas utiliser std:: pose un autre soucis. Dans mes conventions d'écriture, "list" ressemble à une variable locale ou à un paramètre. En mettant std::list, mon oeil identifie rapidement un type venant de la stl.

Mis à part ça, ce n'est pas excessivement gênant.

Pour using namespace en général, j'ai tendance à ne pas utiliser au top level, sauf dans les tests unitaires (qui sont souvent dans un namespace différent de la classe à tester), mais jamais pour le namespace std.

Et jamais dans un .h, bien évidemment.
Mokona
Hello World, I'm new !
 
Messages: 1686
Inscription: 13 Mar 2005, 13:00

Messagepar deathangel » 13 Fév 2010, 00:18

Pour ma part je n'utilise pas les "using namespace". Etant donné que je crée souvent des lib template qui peuvent être utilisées par d'autres, le fait de mettre ce using risquerait de rentrer en conflit avec leur code si eux définissent leur propres conteneurs par exemple.
De plus le fait de taper std:: à chaque fois me permet de mieux filtrer les objets disponibles lors des propositions de complétion automatique (mode fainéant ^^)
95% des problèmes informatiques se situent entre la chaise et le clavier
--> Créez votre robot chien : http://doggyproject.free.fr/
--> Gagnez des PACK+ gratuitement : http://www.packbarre.com/
--> S.U.S Tennis de table http://www.sus.asso.fr
Avatar de l’utilisateur
deathangel
Hello World, I'm new !
 
Messages: 963
Inscription: 10 Avr 2005, 08:50
Localisation: Strasbourg

Messagepar Atréides » 13 Fév 2010, 01:42

Gavos a écrit:Tu veux dire que tu n'utilises pas non plus la STL (vu qu'utiliser la STL implique l'utilisation de son namespace :)) ? Ceci dit je serais très intéressé de savoir quel genre de problème tu avais vu avec les namespaces, je pense que l'utilisation que j'en ai fait jusqu'à présent a dû être assez simpliste...


Ça pour le coup je ne suis pas forcément pour, ça oblige les utilisateurs de ton header à utiliser la 1ère école... Enfin si ce n'est pas destiné à être utilisé par d'autres, tu fais bien ce que tu veux :) Mais quand tu dis "il suffit de ne pas faire n'importe quoi", tu penses à quoi en particulier ?


Je déconnais en disant que j'inclus dans les .hpp. C'est à éviter à tout prix :)
Je dirais que le using namespace devrait être utilisé pour clarifier le code, pas pour l'alourdir. S'il y a un cout dans un fichier cpp, là on peut très bien écrire std::cout, mais dès le moment qu'on utilise beaucoup de choses provenant d'un namespace, toujours utiliser foo::, ça devient lourd et nuit à la lisibilité.

Bon, c'est dodo-time, bonne soirée les enfants :)
Souvent présent sur #gcn, irc.langochat.net
Site web : seuret . com (programmation, biostatistiques, CP Explo 2/1)
Avatar de l’utilisateur
Atréides
 
Messages: 1349
Inscription: 13 Mar 2005, 13:12
Localisation: Suisse

Messagepar Gavos » 13 Fév 2010, 17:01

Les problèmes potentiels d'un using namespace std; (ou autres)

Pour ma part je parlais spécifiquement du namespace std. En fait je considère (peut-être à tort) la STL comme faisant partie intégrante du langage. Du coup j'aime bien écrire string comme j'écrirais int. J'irais même jusqu'à dire que j'adorerais avoir de la coloration syntaxique pour les types de la STL !

* perturbe l'utilisation de la compilation via des blobs ;

Alors là je ne connais pas, et je n'ai pas réussi à trouver d'informations là-dessus. C'est quoi la "compilation via des blobs" ?

* si toi, tu appelle simple_list plutôt que gavos::list, ce n'est pas forcément le cas d'une lib que tu vas devoir inclure.

Je partais effectivement du principe que personne ne s'amuserait à faire des classes qui se nommeraient comme celles de la STL. Si c'était le cas (mettons une lib "mokona" ^^), alors j'utiliserais mokona::list pour cette autre lib pour bien préciser que ce n'est pas une liste de la STL...

Dans mon cas, ne pas utiliser std:: pose un autre soucis. Dans mes conventions d'écriture, "list" ressemble à une variable locale ou à un paramètre. En mettant std::list, mon oeil identifie rapidement un type venant de la stl.

C'est effectivement le souci que j'ai eu quand j'ai commencé à utiliser using namespace std :). Mais je suis sûr que ça ne te pose pas de problème de voir int ! C'est pour ça que je trouverais justifié d'avoir de la coloration syntaxique pour les types de la STL. Mais j'avoue ne pas avoir beaucoup cherché, est-ce que c'est possible sous VS2008 ?

Etant donné que je crée souvent des lib template qui peuvent être utilisées par d'autres, le fait de mettre ce using risquerait de rentrer en conflit avec leur code si eux définissent leur propres conteneurs par exemple.

Mais ça ce n'est valable que lorsqu'on met le using namespace dans le .h, non ? Et ça on est donc tous d'accord (ouf !) pour dire que ça ne se fait pas.

Seulement voilà, dans toutes mes explications je considère effectivement que la STL fait partie intégrante du C++. C'est peut-être naïf, il y a peut-être beaucoup mieux que la STL dans certains cas et je devrais peut-être la considérer comme une lib comme les autres... mais jusqu'à présent je n'ai jamais rencontré ce cas.
Gavos
 
Messages: 1076
Inscription: 19 Mar 2005, 13:00

Messagepar deathangel » 13 Fév 2010, 18:54

Gavos a écrit:Mais ça ce n'est valable que lorsqu'on met le using namespace dans le .h, non ? Et ça on est donc tous d'accord (ouf !) pour dire que ça ne se fait pas.


d'accord pour le .h, mais comme t'es dans une lib template, j'ai tout mon code dans un .hpp en général. Et je distribue ce fichier au lieu de m'amuser à instancier ma classe pour chaque type connu.

Donc au final, ca revient presque au même que de l'avoir dans le .h malheureusement :s (je sais c'est cracra...) c'est pour ca que je n'utilise jamais le using
95% des problèmes informatiques se situent entre la chaise et le clavier
--> Créez votre robot chien : http://doggyproject.free.fr/
--> Gagnez des PACK+ gratuitement : http://www.packbarre.com/
--> S.U.S Tennis de table http://www.sus.asso.fr
Avatar de l’utilisateur
deathangel
Hello World, I'm new !
 
Messages: 963
Inscription: 10 Avr 2005, 08:50
Localisation: Strasbourg

Messagepar Gavos » 13 Fév 2010, 20:31

Ah oui effectivement, je n'avais pas fait le rapprochement. Le coup des .hpp ce n'est pas forcément crado, boost fait beaucoup ça par exemple... et puis de toutes façons tu n'as pas trop le choix :p
Gavos
 
Messages: 1076
Inscription: 19 Mar 2005, 13:00


Retourner vers Programmation

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 12 invités

cron