11.3. Directive using

La directive using permet d'utiliser, sans spécification d'espace de nommage, non pas un identificateur comme dans le cas de la déclaration using, mais tous les identificateurs de cet espace de nommage.

La syntaxe de la directive using est la suivante :

using namespace nom;
nom est le nom de l'espace de nommage dont les identificateurs doivent être utilisés sans qualification complète.

Exemple 11-13. Directive using

namespace A
{
    int i;        // Déclare A::i.
    int j;        // Déclare A::j.
}

void f(void)
{
    using namespace A; // On utilise les identificateurs de A.
    i=1;          // Équivalent à A::i=1.
    j=1;          // Équivalent à A::j=1.
    return ;
}

Après une directive using, il est toujours possible d'utiliser les noms complets des identificateurs de l'espace de nommage, mais ce n'est plus nécessaire. Les directives using sont valides à partir de la ligne où elles sont déclarées jusqu'à la fin du bloc de portée courante. Si un espace de nommage est étendu après une directive using, les identificateurs définis dans l'extension de l'espace de nommage peuvent être utilisés exactement comme les identificateurs définis avant la directive using (c'est-à-dire sans qualification complète de leurs noms).

Exemple 11-14. Extension de namespace après une directive using

namespace A
{
    int i;
}

using namespace A;

namespace A
{
    int j;
}

void f(void)
{
    i=0;    // Initialise A::i.
    j=0;    // Initialise A::j.
    return ;
}

Il se peut que lors de l'introduction des identificateurs d'un espace de nommage par une directive using, des conflits de noms apparaissent. Dans ce cas, aucune erreur n'est signalée lors de la directive using. En revanche, une erreur se produit si un des identificateurs pour lesquels il y a conflit est utilisé.

Exemple 11-15. Conflit entre directive using et identificateurs locaux

namespace A
{
    int i;  // Définit A::i.
}

namespace B
{
    int i;  // Définit B::i.
    using namespace A;   // A::i et B::i sont en conflit.
                         // Cependant, aucune erreur n'apparaît.
}

void f(void)
{
    using namespace B;
    i=2;    // Erreur : il y a ambiguïté.
    return ;
}