Namespaces
Les conflits de noms
Le C est un langage pour lequel il est impossible de compter toutes les bibliothèques qui sont écrite pour lui. Il arrive parfois que les auteurs de ces bibliothèques (puisqu'ils ne se consultent pas) appelent deux de leurs fonctions de la même façon. Ceci ne pose problème que lorsque quelqu'un essaie d'utiliser ces deux bibliothèques en même temps. A ce moment là, au moment de l'édition de lien, il est impossible de distinguer une fonction de l'autre, ce qui pose problème. Le C ne propose aucune solution à ce type de problème; il faut impérativement modifier le code de l'une des bibliothèque (ce qui nous fait perdre la compatibilité avec les versions supérieur).
La solutions du C++
Comme vous l'aurez probablement deviné, il y a une relation entre les namespaces et le problème des conflits de noms. Namespace (signifiant espace de noms) est le mot clé du C++ qui permet de sectoriser les fonctions. Les noms des fonctions vont être assignés comme dans une boîte. Et si on crée une deuxième boîte, on pourra y mettre une fonction sans ce soucier de sa présence dans une autre boîte.
Vous allez me dire: "Et que passe t'il si deux developpeurs appelent leurs namespaces de la même façon ?". Je répondrais qu'ils méritent bien leurs problèmes!! :)
Voici un exemple trivial d'utilisation des namespaces.
namespace A
{
int b;
}
namespace B
{
int b;
}
L'opérateur:: encore et toujours.
Et oui encore lui... C'est cet opérateur qui va nous permettre d'accéder à une variable qui n'est pas dans le namespace courant. Si l'on a un namespace A dans lequel il y a une fonction fnct; on pourra l'appeler de l'extérieur en faisant A::fnct(). Il est à noter que si une variable var n'est dans aucun namespace, elle se trouve en fait dans le namespace sans nom. On pourra alors l'appeler avec ::var.
Le mot clé using
Il est généralment rapidement fatiguant de mettre A:: avant toutes ses variables. C'est pourquoi le C++ nous fournit le mot clé using. En faisant: "using namespace A;" toute les variables, dont on ne précise pas le namespace, seront considérées comme faisant parti de A.
Je voudrais parler quelques instants du namespace std. Ce namespace est réservé à la bibliothèque standard du C++ (iostream, queue, stack, list...). En outre avant je ne l'ai pas mis et tout semblait fonctionner. Il s'agit simplement du fait que les entêtes de la bibliothèque standard du C++ exite en deux versions. Par exemple on trouve <iostream> et <iostream.h>. Ceux qui on le .h définissent les classes, variables fonctions dans l'espace sans nom; tandis que les autres (sans .h) les définissent dans std.