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


Answers:


186

名称空间别名是通过不同的较短名称来引用长名称空间名称的便捷方法。

例如,假设您想使用Boost的uBLAS中的数字矢量而没有using namespace指令。每次都要声明完整的名称空间很麻烦:

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

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

namespace ublas = boost::numeric::ublas;


ublas::vector<double> v;

7
为了解释下降的投票,SO永远不会取代一本好的C ++教科书。您提出的问题将通过任何此类书籍得到解答。回答您自己的问题的SO“功能”不应被用来提供此类书籍的表述。

24
没有冒犯……只是为了解释我为什么这样做:从播客中Joel的评论中我了解到,即使是“入门级”问题在SO上也是公平的,问一个问题并回答是可以接受的您自己,如果该内容尚未以可访问的形式出现在SO上。但是显然,这是不满意的吗?
Martin B

1
回答您自己的问题肯定有礼节,以免引起不适。在这种情况下,很明显,这从来不是一个真正的问题。例如,stackoverflow.com
questions/494927/…

6
@马丁B:我不同意这是一个入门级的问题-实际上,在过去,现在有很多投票都提出了更为明显的问题。话虽如此,人们可能会觉得您只是在试图为自己赢得声誉。一种解决方法是将一个或两个问题/答案标记为“社区Wiki”。就我个人而言,我会问你一个问题并作为社区来回答。如果问题是有根据的,那么您将获得投资回报率。
理查德·科登,2009年

1
我认为重要的问题是这个问题是否真实” –是您被问过的问题吗?是人们想知道的问题吗?是否还没有在SO上被问及回答过?关于R社区的SO博客帖子,在此处发布和回答问题,请注意,他们选择了社区实际上一直在问的头X个问题,因此它具有真实世界的相关性。不太有用
。–杰夫

7

很简单,#define不起作用。

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

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


3
什么#define?也许您的答案是指该问题的先前版本?
einpoklum '16


3

还要注意,名称空间别名和using指令是在编译时而不是运行时解析的。(更具体地说,如果在当前作用域或其父作用域中找不到特定的符号,它们都是用来告诉编译器解析名称的其他工具。)例如,它们都不会有编译:

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

以上内容的用途可能有限,但应达到目的。

(对于上面可能遗漏的任何错字,我深表歉意。)


0

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

例如:

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

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

现在,您有了两个类的名称栏,这些名称栏完全不同,并且由于命名空间的不同而分开。

您显示的“使用名称空间”是这样,您不必指定名称空间即可在该名称空间中使用类。即std :: string变成字符串。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.