<c++>using namespace std;

Résolu/Fermé
jacinthe87 Messages postés 194 Date d'inscription mercredi 4 février 2009 Statut Membre Dernière intervention 15 juillet 2010 - 31 mai 2009 à 14:37
mamiemando Messages postés 33077 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 18 avril 2024 - 1 juin 2009 à 03:14
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 33077 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 18 avril 2024 7 748
1 juin 2009 à 03:14
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 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
31 mai 2009 à 16:31
Un petit lien utile sur les namespaces
2