在 C + + 中,什么是“名称空间别名”?

什么是 C + + 中的“名称空间别名”? 它是如何使用的?

70324 次浏览

名称空间别名是一种方便的方法,可以通过不同的、更短的名称引用较长的名称空间名称。

例如,假设您希望在没有 using namespace指令的情况下使用 Boost 的 uBLAS 中的数值向量。每次说明完整的名称空间都很麻烦:

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

相反,您可以为 boost::numeric::ublas定义一个别名——假设我们想将其缩写为 ublas:

namespace ublas = boost::numeric::ublas;




ublas::vector<double> v;

很简单,# Definition 不起作用。

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

编译良好。可以解决名称空间/类名称冲突。

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

在最后一行,“ Hum: Oops”是一个编译错误。预处理程序将其更改为 No: : Oops,但 No 已经是一个类名。

更多关于这个主题的资料

这完全是关于为 Looong 名称空间名称选择别名,例如:

namespace SHORT = NamespaceFirst::NameSpaceNested::Meow

然后,您可以 typedef

typedef SHORT::mytype

而不是

typedef NamespaceFirst::NameSpaceNested::Meow::mytype

这种语法只适用于名称空间,不能包含类,类型在 namespace NAME =之后

还要注意,命名空间别名和使用指令是在编译时而不是运行时解析的。(更具体地说,它们都是用来告诉编译器在解析名称时,如果它无法在当前作用域或其任何父作用域中找到特定的符号,那么它还可以查看哪些地方的工具。)例如,它们都不会编译:

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;

现在,一个好奇的头脑可能已经注意到 constexpr变量也在编译时使用,并想知道它们是否可以与别名或指令结合使用。据我所知,他们不能,虽然我可能错了。如果需要在不同的名称空间中使用同名变量,并在它们之间动态地进行选择,则必须使用引用或指针。

// 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;
}
}

上述方法的用处可能是有限的,但它应该能够达到目的。

(对于上面我可能错过的任何类型,我表示歉意。)

命名空间用于防止名称冲突。

例如:

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


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

现在有了两个类名称栏,由于名称空间的原因,它们是完全不同和独立的。

您显示的“ using nampace”是为了不必指定名称空间来使用该名称空间中的类。字符串变成字符串。

我的资源: https://www.quora.com/What-is-namespace-in-C++-1