在另一个命名空间内“使用命名空间”的范围

Scope of `using namespace` within another namespace

我知道我把 using 指令的范围限制在一个块或一个函数中。然后它将仅适用于该范围。但是如果块是 namespace 它显然适用于同一命名空间的所有块。那是对的吗?至少,以下示例表明:(http://ideone.com/K8dk7E)

namespace N1
{
    struct Foo{};
}

namespace N2
{
    using namespace N1;
    Foo f;
}

namespace N2
{
    Foo f2;
}

int main()
{
    N2::f2;
}

我原以为 Foo f2 会报错,因为 Foo 应该是未知的。 所以我真正的问题是,命名空间块中的 using 语句是否对同一命名空间的所有块都有效?

当所有 cpp 文件被包含并一起编译时,这会导致问题,因为它污染了其他 cpp 文件,这些文件不应包含其他名称空间(放置 using 指令的名称空间)。因此,实际上它可能会导致不良冲突。

我认为根据名称空间理论,您的问题是正确的,因为这种机制用于将库定义的名称放入单个 位置,它有助于避免 无意的名称冲突 .

Is a using statement within a namespace block in effect for all blocks of the same namespace?

当 using 指令在翻译单元中可见(包含在内)时,是的。

由此产生的封闭命名空间污染是您不将这些语句放在头文件中或避免使用它们的原因 generally/in 命名空间范围。

供参考:

标准说 (7.3.4/2)

A using-directive specifies that the names in the nominated namespace can be used in the scope in which the using-directive appears after the using-directive .

namespace A {  \
int i = 9;      | <-- namespace A scope. 
}              /

namespace B {      \
using namespace A;  | <-- namespace B scope. "i" is visible after 
void bar()          |     the "using namespace" line.
{                   |
    i += 1; /*Ok*/  |     
}                   |
}                  /

namespace B {     \
void foo()         |
{                  | <-- still namespace B scope. "i" is still visible
    i += 1; /*Ok*/ |
}                  |
}                 /

因此,使用此 using 指令可见的内容将在 using namespace B 行之后的 A 范围内随处可见。当然,如果你在头文件中这样做,所有的东西都会在你包含该头文件的任何地方可见,所以你不应该在头文件的任何地方真正使用 "using namespace..."。