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

using namespace std; ou std:: ? [c++] - C++ - Programmation

Marsh Posté le 08-10-2013 à 21:10:03    

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?
 
 
 

Reply

Marsh Posté le 08-10-2013 à 21:10:03   

Reply

Marsh Posté le 08-10-2013 à 22:07:46    

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é!  --
Reply

Marsh Posté le 09-10-2013 à 15:36:24    

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
Reply

Marsh Posté le 09-10-2013 à 18:42:52    

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 :)

Reply

Marsh Posté le 11-11-2013 à 11:01:05    

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.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed