提问人:relaxxx 提问时间:10/6/2015 最后编辑:moooeeeeprelaxxx 更新时间:4/9/2023 访问量:3638
另一个命名空间中“使用命名空间”的范围 [duplicate]
Scope of `using namespace` within another namespace [duplicate]
问:
我知道 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 f2
Foo
using
当包含所有 cpp 文件并一起编译时,这会导致问题,因为它污染了其他 cpp 文件,这些文件不应该包含其他命名空间(放置 using 指令的命名空间)。因此,实际上它可能会导致不良冲突。
答:
0赞
srhaider
10/6/2015
#1
我认为根据命名空间理论,您的问题是正确的,因为这种机制用于将库定义的名称放入单个 地方,它有助于避免无意中的名称冲突。
1赞
moooeeeep
10/6/2015
#2
命名空间块中的语句是否对同一命名空间的所有块都有效?
using
当 using 指令在翻译单元(包含在内)中可见时,是。
例如,封闭命名空间的污染是您不将这些语句放在头文件中的原因,或者通常/在命名空间范围内避免它们。
供参考:
- http://en.cppreference.com/w/cpp/language/namespace
- http://en.cppreference.com/w/cpp/language/namespace#Using-directives
- 为什么“使用命名空间 std”被认为是不好的做法?
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...”标头中的任意位置。i
using namespace A
下一个:指令和变量
评论