Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1872 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  [c++]using namespace std; ou std:: ?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[c++]using namespace std; ou std:: ?

n°2205979
ladalle198​8
Posté le 08-10-2013 à 21:10:03  profilanswer
 

Hello, je débute en c++ .  
 
J'en suis au commencement, et apres une petite recherche sur le net je suis tombé par hasard sur ce qui doit etre un éternel débat :  
 
using namespace sdt; ou std:: ?  
 
et j'admet que vu mon niveau de c++, j'ai pas trop compris le pourquoi du comment, mais tant qu'a faire autant partir sur de bonne base, alors je viens demander conseil ici. (c'est plus facile de commencer directement "juste" que de perdre une mauvaise habitude :) )
 
code:block me donne ceci quand je lance le soft pour la premiere fois :

Code :
  1. #include <iostream>
  2. using namespace std; // semblerait que ca risque de créer des conflits si y'a plusieurs "count" different
  3. int main()
  4. {
  5.     cout << "Hello world!" << endl;
  6.     return 0;
  7. }


 
mais apparement comme ca aussi c'est juste :

Code :
  1. #include <iostream>
  2. int main()
  3. {
  4.     std::cout << "Hello world!" << std::endl; //plus long a ecrire, mais plus clair
  5.     return 0;
  6. }


 
et semblerait que y'a moyen de faire comme ca aussi

Code :
  1. #include <iostream>
  2. int main()
  3. {
  4.     using std::cout; // semble le plus logique pour moi
  5.     using std::endl;     
  6.     cout << "Hello world!" << endl;
  7.     return 0;
  8. }


 
Du coup, je me demande qu'est-ce qui est la facon la plus "logique" ? et surtout, en vrai, ca change quoi?
 
 
 

mood
Publicité
Posté le 08-10-2013 à 21:10:03  profilanswer
 

n°2205992
gilou
Modérateur
Modzilla
Posté le 08-10-2013 à 22:07:46  profilanswer
 

Il faut être pragmatique, ça dépend de ce que tu fais.

Code :
  1. #include <iostream>
  2. int main()
  3. {
  4.     std::cout << "Hello world!" << std::endl;
  5.     return 0;
  6. }


Cette méthode est la plus précise: tu explicites exactement chaque objet.
Inconvénient: ça devient vite lourd.
 

Code :
  1. #include <iostream>
  2. using namespace std;
  3. int main()
  4. {
  5.     cout << "Hello world!" << endl;
  6.     return 0;
  7. }


Cette méthode est la moins précise, puisque tous les noms du namespace std sont importés, ça risque de t’empêcher d'employer localement un nom déjà déclaré dans le namespace std. C'est néanmoins assez pratique.
 
On peut aussi choisir un moyen terme: n'importer du namespace std que les noms nécessaires et pas plus:
 

Code :
  1. #include <iostream>
  2. using std::cout;
  3. using std::endl;   
  4.  
  5. int main()
  6. {
  7.     cout << "Hello world!" << endl;
  8.     return 0;
  9. }


 
Je préfère cette dernière forme, et je ne remplace par un using namespace std;  que quand le nombre de using std::xxx; devient trop important.
Noter aussi que si je n'utilise un objet qu'une ou deux fois, je vais plutôt utiliser la notation std::xxx en lieu et place, les using std::xxx; n'ont d'intérêt que pour ce qu'on utilise fréquemment.
   
A+,


Message édité par gilou le 08-10-2013 à 22:17:28

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2206071
theshockwa​ve
I work at a firm named Koslow
Posté le 09-10-2013 à 15:36:24  profilanswer
 

il y a une bonne règle à appliquer : jamais de using namespace dans un header.
 
Au sein d'un cpp, c'est moins problématique, mais bon, les namespaces sont là pour résoudre des problèmes d'ambigüité, et les using namespaces les font revenir à la charge


---------------
last.fm
n°2206133
ladalle198​8
Posté le 09-10-2013 à 18:42:52  profilanswer
 

Ok, merci a vous 2 :)  
 
Comme j'ai dis, c'est surtout pour ne pas prendre de mauvaises habitudes dès le début, c'est trop dur de s'en débarrasser après ^^
 
la 3eme solution de gilou est celle que je trouve la plus pratique, on va partir la dessus :)

n°2209896
user89
Posté le 11-11-2013 à 11:01:05  profilanswer
 

La bonne habitude c'est de ne jamais faire de using namespace au niveau global, même pour des fichiers sources. Dans la vraie vie, tu vas te retrouver rapidement à utiliser beaucoup beaucoup de choses de std:: (et aussi de boost:: et d'autres namespace), et faire un gros pâté de using std::xxx au début de ton fichier source va rapidement être gonflant.
 
Sans compter que, comme cela a été dit, tu ne dois absolument pas importer de nom au niveau global dans les fichiers à inclure. Or, cela concerne non seulement les déclarations de tes fonctions/objets qui sont dans tes fichiers sources, mais également tout ton source templaté, qui peut représenter une grosse partie de ton code.
 
Tu vas donc te retrouver avec une moitié de ton code sans using (déclaration, code template) et une partie avec, ce qui va être rapidement schizophrénique, et n'aide pas à l'homogénéité de la lecture de ton code, qui est importante en pratique.
 
Une autre solution (bien meilleure) est d'utiliser un using namespace à l'intérieur de tes fonctions. Mais, comme une autre bonne habitude à prendre, c'est d'écrire des fonctions très courtes, tu vas là aussi t'apercevoir que rajouter un using namespace std; (et éventuellement d'autres namespace) pour chaque petite fonction ne va pas vraiment te faire gagner du temps et de l'espace, tout en apportant toujours ce risque de conflit.
 
Mon conseil sera donc de ne pas importer de namespace du tout. Il ne faut pas toujours suivre les exemples que l'on trouve dans les livres d'introduction au langage et qui ont surtout pour but de rendre le code moins intimidant pour les débutants.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  [c++]using namespace std; ou std:: ?

 

Sujets relatifs
anonymous namespace et static[XSLT] déclaration de namespace et localisation attribut
Error connexion with Ethernet NIC card using winpcapValidation XML en Java - Problème de namespace
webservice C# et consommation SOAP : problème de namespaceInstanciation d'une classe dans le scope global à partir dun namespace
[Resolu] namespace std n'existe pasB. Stroustrup - Programming: Principles and Practice Using C++
using namespace std.... 
Plus de sujets relatifs à : [c++]using namespace std; ou std:: ?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR