rel*_*xxx 4 c++ scope using-directives
我知道我把using指令的范围限制在一个块或一个函数放在里面.然后它将仅适用于该范围.但是如果块是a,namespace它通过相同命名空间的所有块显然适用.那是对的吗?至少,以下示例表明:(http://ideone.com/K8dk7E)
namespace N1
{
struct Foo{};
}
namespace N2
{
using namespace N1;
Foo f;
}
namespace N2
{
Foo f2;
}
int main()
{
N2::f2;
}
Run Code Online (Sandbox Code Playgroud)
我本来应该Foo f2给出一个错误,因为Foo应该是未知的.所以我真正的问题是,using对于同一名称空间的所有块,名称空间块中的语句是否有效?
当所有cpp文件被包含在一起编译时会导致问题,因为它会污染其他cpp文件,这些文件不应该包含其他命名空间(放置using指令的那个).因此,实际上它可能会导致不良冲突.
标准说(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*/ |
} |
} /
Run Code Online (Sandbox Code Playgroud)
因此,使用此指令可见的内容将using namespace B在行后的A范围内随处可见.当然,如果你在头文件中执行此操作,所有内容将在包含该头文件的任何位置都可见,因此您不应该在头文件中的任何位置使用"using namespace ...".