Exood4 Studio - Video Game Development, Toulouse (France)
Exood4 Studios Exood4 Tutorials

   
L a n g a g e   C++

L e s   e s p a c e s   d e   n o m m a g e






 Dans un programme, les fonctions globales, les variables globales et les classes sont placés de façon implicite dans un espace de nommage global. Le mot-clé static permet de rendre locale une variable ou une fonction. Mais dans un grand projet, le manque de contrôle de l'espace de nommage global peut causer des problèmes.

 Comme alternative à cela, les fabriquants (de librairies etc...) créent des noms longs et compliqués pour ne pas risquer d'entrer en conflit de nommage, mais nous sommes alors obligés d'utiliser et d'écrire ces noms longs dans nos programmes. typedef est souvent utilisé pour simplifier cela, mais ce n'est pas une solution élégante.

 Il est possible de subdiviser l'espace de nommage global en plusieurs sous espaces en utilisant la commande namespace du C ++. Le mot-clé namespace, semblable à class, struct, enum et union, met les noms de ses membres dans un espace distinct. Bien que les autres mots-clés soient complémentaires, la création d'un nouvel espace de nommage est la seule utilisation possible pour namespace.


Création d'un espace de nommage


 La création d'un espace de nommage est très similaire à la création d'une classe :

namespace MonEspace
{
 // Déclarations
}

 Ceci produit un nouvel espace de nommage contenant les déclarations situées entre les accolades. Toute variable, fonction, classe etc... déclarée dans un espace de nommage sera alors accessible en utilisant l'opérateur de résolution de portée ::


Exemple :

namespace MonEspace
{
 int a, b, c;
}

int a;

void main ()
{
 a = 1; // la variable a globale reçoit la valeur 1

 MonEspace::a = 2; // la variable a de l'espace de nommage MonEspace reçoit 2
}

 Une autre solution consiste à utiliser le mot-clé using :

namespace MonEspace
{
 int a, b, c;
}

using namespace MonEspace;

void main ()
{
 a = 2; // la variable a de l'espace de nommage MonEspace reçoit 2
}

Attention aux ambiguïtés lors de la compilation en utilisant using, toute déclaration contenue dans l'espace de nommage est alors susceptible d'entrer en conflit avec les déclarations globales du programme. A n'utiliser que dans un fichier d'implémentation (cpp) !

 Il y a des différences importantes par rapport à class et struct :
  • Un espace de nommage peut uniquement être défini en global ou à l'intérieur d'un autre espace de nommage

  • Il n'y a pas de point-virgule à la fin de la déclaration d'un espace de nommage (après l'accolade)

  • La définition d'un espace de nommage peut se déclarer en plusieurs parties :

    namespace MonEspace
    {
     int a, b, c;
    }

    ...

    namespace MonEspace
    {
     int d; // la déclaration de d se rajoute à l'espace MonEspace défini plus haut
    }


  • Il est possible de renommer un espace de nommage pour ne pas avoir à retaper un éventuel nom d'espace trop long :

    namespace Ceci_est_un_exemple_d_espace_de_noms // un peu trop long ...
    {
     ...
    }

    namespace nom_court = Ceci_est_un_exemple_d_espace_de_noms;


  • Contrraitement aux classes il est impossible de créer une instance d'un espace de nommage.


Les espaces de nommage sans identifiant


 Les espaces de nommage peuvent être déclarés sans identifiant, dans ce cas toute déclaration contenue dans cet espace sera considérée comme locale au fichier dans lequel il est défini. L'opérateur de résolution de portée :: ne peut plus être utilisé.


Exemple :

namespace // équivalent à déclarer static int a, b, c;
{
 int a, b, c;
}

void main ()
{
 a = 1; // a, b et c sont directement accessibles dans le module
 b = c = 2; // contenant la déclaration de l'espace de nommage
}



  Retour en haut de page