此问题已在此处有答案:
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指令的命名空间)。因此,实际上它可能会导致不必要的冲突。
3条答案
按热度按时间kknvjkwl1#
标准规定(7.3.4/2)
using-directive指定指定命名空间中的名称可以在using-directive出现在using-directive之后的范围中使用。
因此,使用using指令(即变量
i
)使其可见的内容将在using namespace A
行之后的B作用域中的任何地方可见。当然,如果您在头文件中这样做,则所有内容都将在包含该头文件的任何地方可见,因此您不应该在头文件中的任何地方使用“using namespace...”。bybem2ql2#
命名空间块中的
using
语句是否对同一命名空间的所有块有效?当using指令在翻译单元中可见时(包含),是。
封闭的命名空间的结果污染是为什么你不把这些语句放在头文件中,例如,或避免他们一般/在命名空间范围。
供参考:
xlpyo6sf3#
我认为根据命名空间理论,你的问题是正确的,因为这种机制是用来把一个库定义的名称放在一个地方,它有助于避免 * 无意的名称冲突 *。