<c++>using namespace std;

Résolu
jacinthe87 Messages postés 194 Date d'inscription   Statut Membre Dernière intervention   -  
mamiemando Messages postés 33774 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour,
C'est quoi la diffecrence entre
using namespace std;

et
std::


y'a des personnes qui disent qu'il faut eviter les "using namespace std;" surtout si on travaille avec des templates, mais est ce n'est pas la meme chose(std:: <=> using namespace std)???

2 réponses

mamiemando Messages postés 33774 Date d'inscription   Statut Modérateur Dernière intervention   7 882
 
Qu'est ce qu'un namespace ?

Tu peux voir un namespace un peu comme un "répertoire" contenant éventuellement d'autres namespaces, des classes, des fonctions etc... Le namespace "racine" est noté ::. Par exemple std::endl est en fait ::std::endl.

Un namespace n'a donc rien à voir avec les templates. Ça permet d'éviter juste des collisions entre les noms provenant de librairies extérieures et ton code. Par exemple pour éviter une collision entre une fonction que tu appellerais max et la fonction max de la lib C++, la fonction max est dans le namespace std.

Un using namespace std; et un std:: on deux rôles fondamentalement différents.

- Un using namespace permet de dire au compilateur : en plus de regarder dans le namespace ::, si tu ne trouves pas un symbole (fonction, classe...), regarde si tu le trouves dans le namespace std.

- Le fait d'écrire std::max dit au compilateur de chercher explicitement la fonction max du namespace std::.

Pourquoi mieux vaut éviter les using namespace ?

En ce qui me concerne je te déconseille d'utiliser les using namespace. Si l'écriture est certes plus légère, le programme n'est pas forcément plus lisible et peut ne pas compiler à cause d'ambiguïtés. En particulier, il ne faut jamais mettre un using namespace dans un header car celui-ci peut "contaminer" des sections de code et engendrer des collisions.

Par exemple si un header a.hpp défini une fonction int max(int,int) et inclue b.hpp qui fait un using namespace std, tout fichier qui inclura b.hpp et appelera int max(int,int) risque de ne plus compiler à cause d'une ambiguïté.

Ceci dit comme un fichier cpp n'est jamais inclu, libre à toi d'inclure (à tes risques et périls) d'y faire des using namespace.

Comment ça s'utilise ?

Tout simplement comme ça :
#include <iostream>

namespace pouet{
  inline void plop(){
    std::cout << "plop" << std::endl;
  }
}

int main(){
  pouet::plop();
  return 0;
}

Attention à mettre tes #include en dehors des namespace, sans quoi le code sera inclu... dans ce namespace (ce serait dommage de devoir appeler pouet::std::endl !)

Bonne chance
8
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
Un petit lien utile sur les namespaces
2