另一个命名空间中“使用命名空间”的范围 [duplicate]

Scope of `using namespace` within another namespace [duplicate]

提问人:relaxxx 提问时间:10/6/2015 最后编辑:moooeeeeprelaxxx 更新时间:4/9/2023 访问量:3638

问:

我知道 using 指令的范围仅限于放入其中时的块或函数。然后,它将仅适用于该范围。但是,如果块是这是对的吗?至少,以下示例表明:(http://ideone.com/K8dk7Enamespace)

namespace N1
{
    struct Foo{};
}

namespace N2
{
    using namespace N1;
    Foo f;
}

namespace N2
{
    Foo f2;
}

int main()
{
    N2::f2;
}

我本来以为会给出一个错误,因为应该是未知的。 所以我真正的问题是,命名空间块中的语句是否对同一命名空间的所有块都有效?Foo f2Foousing

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

C++ 作用域 using 指令

评论

0赞 SingerOfTheFall 10/6/2015
您是否在问 N1 成员是否会在 N2 的 extension-namespace-definition 中可见?
0赞 StoryTeller - Unslander Monica 10/6/2015
我觉得您提供的示例并不能很好地说明您的问题。使用 SUC,帖子中的代码可以很好地编译。
0赞 StoryTeller - Unslander Monica 10/6/2015
您确定这不仅仅是单个文件的包含顺序的问题吗?
0赞 relaxxx 10/6/2015
@SingerOfTheFall基本上是的,请参阅我的问题的编辑
0赞 relaxxx 10/6/2015
@StoryTeller它编译得很好,这就是问题所在。请参阅我的问题的编辑

答:

0赞 srhaider 10/6/2015 #1

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

1赞 moooeeeep 10/6/2015 #2

命名空间块中的语句是否对同一命名空间的所有块都有效?using

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

例如,封闭命名空间的污染是您不将这些语句放在头文件中的原因,或者通常/在命名空间范围内避免它们。

供参考:

9赞 SingerOfTheFall 10/6/2015 #3

标准说 (7.3.4/2)

一个 using指令 指定 Nominated 命名空间中的名称可以在 using指令 出现在 using指令 .

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 指令(即变量)可见的内容将在行之后的 B 范围内的任何地方可见。当然,如果你在头文件中执行此操作,那么所有内容都将在包含该头文件的任何地方可见,因此您不应该真正使用“using namespace...”标头中的任意位置。iusing namespace A