【问题标题】:Scope of `using namespace` within another namespace [duplicate]另一个命名空间中“使用命名空间”的范围[重复]
【发布时间】:2016-01-03 02:51:54
【问题描述】:

我知道我将 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 指令的命名空间)。因此,实际上它可能会导致不受欢迎的冲突。

【问题讨论】:

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

标签: c++ scope using-directives


【解决方案1】:

标准说 (7.3.4/2)

一个 使用指令 指定指定命名空间中的名称可以在 使用指令 之后出现 使用指令 .

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 范围内的任何地方可见。当然,如果您在头文件中执行此操作,那么所有包含该头文件的地方都会显示所有内容,因此您不应真正在头文件中的任何地方使用“使用命名空间...”。

【讨论】:

  • i += 1 可以进入命名空间范围吗?
  • @0x499602D2,当然不是,我忘了把它包装在一个函数中。谢谢
【解决方案2】:

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

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

由此造成的封闭命名空间污染是为什么你不将这些语句放在头文件中,或者通常避免它们/在命名空间范围内。

供参考:

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-05
      • 1970-01-01
      相关资源
      最近更新 更多