C++中的using namespace语句

6
namespace MyNamespace
{
    static void foo1()
    {

    }
}

using namespace MyNamespace;

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

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

我的问题是,using namespace ANAMESPACE_NAME是否意味着将来自命名空间ANAMESPACE_NAME的所有元素导入到全局命名空间中?

4个回答

5

"using namespace 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.

+1:使用指令不一定要在全局范围内。 - Björn Pollex

3
这里我们可以使用::foo1()。这意味着方法foo1()在全局命名空间中,对吗?
是的,这意味着调用全局命名空间中定义的名为foo1()的方法。这被称为限定命名空间查找。
"using namespace ANAMESPACE_NAME"意味着将ANAMESPACE_NAME命名空间中的所有元素导入到当前命名空间中?
是的,它将从ANAMESPACE_NAME命名空间中导入所有元素到当前命名空间中。这被称为一个使用指令。如果您想要在当前类型中仅导入特定元素,请使用using声明。
格式是: using ANAMESPACE_NAME :: element_name;

3
C++2003标准的第3.4.3.4节有一个答案:
使用一元作用域运算符::(5.1)前缀的名称在全局范围内查找,即在使用它的翻译单元中查找。该名称应在全局命名空间范围内声明或者是由于using指示符(3.4.3.2)的存在,在全局范围内可见的名称
C++11 FDIS中的这段话几乎相同,因此这也可能适用于C++11。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接