Pour être plus précis, using namespace X
sert à dire au compilateur "quand tu recherche un identifiant, regarde aussi dans l’espace de noms X`.
Pour illustrer :
#include <iostream>
namespace A {
void foo() {}
}
void foo() {}
int main() {
foo();
}
Dans ce code, le compilateur regarde dans l’espace de noms général (::
) et trouve que le second foo
.
Avec using namespace
:
Pour illustrer :
#include <iostream>
namespace A {
void foo() {}
}
void foo() {}
using namespace A;
int main() {
foo();
}
Dans ce second code, le compilateur regarde dans l’espace de noms général (::
) ET dans l’espace de noms A
. Il trouve donc 2 fonctions foo
et il ne sait pas laquelle utiliser. Il y a donc une erreur de compilation.
prog.cc:12:5: error: call to 'foo' is ambiguous
foo();
^~~
Donc pourquoi using namespace
est déconseillé ?
- parce que ca fait des ambiguïtés s’il y a plusieur candidats
- parce que le code est moins explicite (si tu veux appeler la fonction
cout
de l’espace de noms std
, écrit explicitement que tu veux utiliser std
.)
- en termes d’apprentissage, c’est préférable que tu apprenne quand tu utilise une fonctionnalité de
std
ou pas. A force d’utiliser using namespace std
, certains ne savent plus d’où vient les fonctionnalités qu’ils utilisent.