繁体   English   中英

C ++使用命名空间语句

[英]C++ using namespace statement

namespace MyNamespace
{
    static void foo1()
    {

    }
}

using namespace MyNamespace;

class MyClass
{
    void foo2()
    {
        ::foo1();
    }    
};

范围解析操作::表示在全局命名空间中使用方法。 在这里我们可以使用::foo1() 这意味着方法foo1()在全局命名空间中,对吗?

我的问题是,是否using namespace ANAMESPACE_NAME意味着我们进口的所有元素形成的命名空间ANAMESPACE_NAME到全局命名空间?

不,“使用命名空间ANAMESPACE_NAME”意味着我们将所有元素导入当前范围。

你可以写这样的东西:

namespace A {
    int i = 10, j = 20;
}

int f()
{
    using namespace A;  // injects names from A into the global scope.
    return i * j;       // uses i and j from namespace A.
}

int k = i * j; // Error: undefined variant i and j.

在这里我们可以使用:: foo1()。 这意味着方法foo1()在全局命名空间中,对吗?

对,那是正确的。 这意味着调用全局命名空间中定义的名为foo1()的方法。 这称为合格命名空间查找

“使用命名空间ANAMESPACE_NAME”意味着我们将ANAMESPACE_NAME命名空间中的所有元素导入全局命名空间?

是的,它将ANAMESPACE_NAME命名空间中的所有元素导入到当前命名空间。
它被称为using指令
如果要导入当前类型的特定元素,请使用声明

格式是:

使用ANAMESPACE_NAME :: element_name;

C ++ 2003标准的3.4.3.4节有一个答案:

在全局范围内,在使用它的转换单元中查找以一元范围运算符::(5.1)为前缀的名称。 该名称应在全局命名空间范围内声明, 或者是一个名称,其声明在全局范围内可见,因为using-directive (3.4.3.2)。

这段在C ++ 11 FDIS中几乎完全相同,所以这可能也适用于C ++ 11。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM