Espaces de nommage

Déclaration et définition

Les espaces de nommage permettent de séparer plusieurs variables/fonctions/classes… de même nom.

Définition d'un espace de nommage :

namespace nom_de_l_espace {

// tout ce qui est défini ici est dans l'espace de nommage

}

Plusieurs espaces de nommage peuvent être déclarés dans le même fichier.
On peut imbriquer les espaces de nommage.
Un espace de nommage peut être déclaré dans plusieurs fichiers, les contenus seront fusionnés.
Il faut déclarer l'espace de nommage dans le fichier d'entête et dans le fichier de source.

On accède à un élément qui est dans un espace de nommage avec l'opérateur :: de la façon suivante : nom_de_l_espace::element.
L'opérateur :: sans préciser le nom d'un espace de nommage avant permet de spécifier explicitement l'espace global.
On peut déclarer une variable de type namespace pour créer un alias d'un espace de nommage (pour simplifier son nom par exemple) comme ceci :

namespace cx = math::artihmetic::complex_numbers;

// cx::add est maintenant équivalent à math::artihmetic::complex_numbers::add

Directives using

Le mot clé using permet d'indiquer dans un bloc qu'on va se référer à une fonction spécifique d'un espace de nommage. Par exemple :

using std::cout;
cout << "un texte" << std:endl;  // On n'a plus besoin de préfixer cout mais c'est toujours nécessaire pour endl

On peut aussi utiliser using namespace sur un espace de nommage complet :

using namespace std;
cout << "un texte" << endl; // On a "tiré" tout l'espace de nommage std dans le bloc en cours

Espace de nommage anonyme

Si l'espace de nommage est déclaré sans nom, ses éléments sont automatiquement accessibles dans l'espace de nommage parent sans prefixe :

#include <iostream>

namespace // espace de nommage anonyme
{
    void afficheDeux() // cette fonction ne peut être appelée que dans ce fichier
    {
        std::cout << 2;
    }
}

int main()
{
    afficheDeux(); // il n'y a pas besoin de préfixe d'espace de nommage
    return 0;
}

Espace de nommage inline

Quand un espace de nommage est déclaré inline, ses fonctions sont utilisées quand le nom de l'espace de nommage n'est pas précisé :

#include <iostream>

inline namespace espaceChiffre
{
    void afficheDeux() // can only be accessed in this file
    {
        std::cout << 2;
    }
}

namespace espaceLettre
{
    void afficheDeux() // can only be accessed in this file
    {
        std::cout << "Deux";
    }
}

int main()
{
    espaceChiffre::afficheDeux();
    espaceLettre::afficheDeux();
    afficheDeux();

    return 0;
}