Question En C ++, qu'est-ce qu'un "alias d'espace de nommage"?


Qu'est-ce qu'un "alias d'espace de nommage" en C ++? Comment est-ce utilisé?


133
2017-07-31 08:55


origine


Réponses:


Un alias d'espace de noms est un moyen pratique de faire référence à un nom d'espace de nom long par un autre nom plus court.

Par exemple, disons que vous vouliez utiliser les vecteurs numériques de UBLAS de Boost sans using namespace directif. Indiquer l’espace de noms complet à chaque fois est lourd:

boost::numeric::ublas::vector<double> v;

Au lieu de cela, vous pouvez définir un alias pour boost::numeric::ublas - disons que nous voulons abréger cela pour juste ublas:

namespace ublas = boost::numeric::ublas;


ublas::vector<double> v;

156
2018-03-20 05:07



Tout simplement, le #define ne fonctionnera pas.

namespace Mine { class MyClass { public: int i; }; }
namespace His = Mine;
namespace Yours { class Mine: public His::MyClass { void f() { i = 1; } }; }

Compile bien. Vous permet de contourner les collisions entre noms de domaine et noms de classe.

namespace Nope { class Oops { public: int j; }; }
#define Hmm Nope
namespace Drat { class Nope: public Hmm::Oops { void f () { j = 1; } }; }

Sur la dernière ligne, "Hmm: Oops" est une erreur de compilation. Le pré-processeur le change en Nope :: Oops, mais Nope est déjà un nom de classe.


7
2018-05-02 10:26



Plus sur ce sujet http://channel9.msdn.com/Series/C9-Lectures-Stephan-T-Lavavej-Core-C-/Stephan-T-Lavavej-Core-C-1-of-n

Il s'agit de choisir un alias pour un nom d'espace de noms looong, tel que:

namespace SHORT = NamespaceFirst::NameSpaceNested::Meow

Puis plus tard, vous pouvez taper

typedef SHORT::mytype

au lieu de

typedef NamespaceFirst::NameSpaceNested::Meow::mytype

Cette syntaxe ne fonctionne que pour les espaces de noms, ne peut pas inclure les classes, les types après le namespace NAME =


1
2018-01-13 23:16



Notez également que les alias d'espaces de noms et les directives d'utilisation sont résolus au moment de la compilation et non lors de l'exécution. (Plus précisément, ils sont les deux outils utilisés pour indiquer au compilateur où chercher lors de la résolution de noms, s’il ne trouve pas de symbole particulier dans l’étendue actuelle ou dans l’une de ses étendues parentes). compiler:

namespace A {
    int foo;
    namespace AA {
        int bar;
    } // namespace AA
    namespace AB {
        int bar;
    } // namespace AB
} // namespace A
namespace B {
    int foo;
    namespace BA {
        int bar;
    } // namespace BA
    namespace BB {
        int bar;
    } // namespace BB
} // namespace B

bool nsChooser1, nsChooser2;
// ...

// This doesn't work.
namespace C = (nsChooser1 ? A : B);
C::foo = 3;

// Neither does this.
// (Nor would it be advisable even if it does work, as compound if-else blocks without braces are easy to inadvertently break.)
if (nsChooser1)
    if (nsChooser2)
        using namespace A::AA;
    else
        using namespace A::AB;
else
    if (nsChooser2)
        using namespace B::BA;
    else
        using namespace B::BB;

Maintenant, un esprit curieux a peut-être remarqué que constexpr les variables sont également utilisées au moment de la compilation et on se demande si elles peuvent être utilisées avec un alias ou une directive. À ma connaissance, ils ne peuvent pas, même si je peux me tromper à ce sujet. Si vous avez besoin de travailler avec des variables nommées de manière identique dans différents espaces de noms et de choisir entre elles dynamiquement, vous devrez utiliser des références ou des pointeurs.

// Using the above namespaces...
int& foo = (nsChooser1 ? A::foo : B::foo);

int* bar;
if (nsChooser1) {
    if (nsChooser2) {
        bar = &A::AA::bar;
    } else {
        bar = &A::AB::bar;
    }
} else {
    if (nsChooser2) {
        bar = &B::BA::bar;
    } else {
        bar = &B::BB::bar;
    }
}

L'utilité de ce qui précède peut être limitée, mais elle devrait servir l'objectif.

(Je m'excuse pour les fautes de frappe que j'ai pu manquer dans ce qui précède.)


1
2017-07-09 15:38



L'espace de noms est utilisé pour empêcher les conflits de noms.

Par exemple:

namespace foo {
    class bar {
        //define it
    };
}

namespace baz {
    class bar {
        // define it
    };
}

Vous avez maintenant deux classes de barre de nom, complètement différentes et séparées grâce à l’espace de noms.

Le "using namespace" que vous montrez est pour que vous n'ayez pas à spécifier l'espace de noms pour utiliser des classes dans cet espace de noms. std :: string devient une chaîne.

ma ressource: https://www.quora.com/What-is-namespace-in-C++-1


0