c++ 在另一个命名空间中使用命名空间的范围[重复]

ltqd579y  于 2023-04-13  发布在  其他
关注(0)|答案(3)|浏览(141)

此问题已在此处有答案

scope of using declaration within a namespace(5个答案)
5年前关闭。
我知道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应该是未知的,所以我希望Foo f2给予一个错误。所以我真实的的问题是,命名空间块中的using语句对同一命名空间的所有块都有效吗?
当所有的cpp文件被包含并编译在一起时,这会导致问题,因为它会污染其他cpp文件,而这些文件不应该包含其他命名空间(使用using指令的命名空间)。因此,实际上它可能会导致不必要的冲突。

kknvjkwl

kknvjkwl1#

标准规定(7.3.4/2)
using-directive指定指定命名空间中的名称可以在using-directive出现在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指令(即变量i)使其可见的内容将在using namespace A行之后的B作用域中的任何地方可见。当然,如果您在头文件中这样做,则所有内容都将在包含该头文件的任何地方可见,因此您不应该在头文件中的任何地方使用“using namespace...”。

bybem2ql

bybem2ql2#

命名空间块中的using语句是否对同一命名空间的所有块有效?
当using指令在翻译单元中可见时(包含),是。
封闭的命名空间的结果污染是为什么你不把这些语句放在头文件中,例如,或避免他们一般/在命名空间范围。
供参考:

xlpyo6sf

xlpyo6sf3#

我认为根据命名空间理论,你的问题是正确的,因为这种机制是用来把一个库定义的名称放在一个地方,它有助于避免 * 无意的名称冲突 *。

相关问题