例如我们有这个程序:
#include <iostream>
namespace a
{
namespace b
{
namespace c
{
int alpha = 5;
}
}
}
int main()
{
using namespace a;
using namespace b;
using namespace c;
std::cout << alpha;
return 0;
}
编译成功后,我认为使用命名空间的行为类似于unix cd
。在代码的第一行,我们位于根::
,然后我们转移到::a
,::a::b
,::a::b::c
。但经过这样的修改和成功的运行,我感到很愚蠢:
int main()
{
using namespace a;
using namespace b;
using namespace c;
using namespace b;
std::cout << alpha;
return 0;
}
它仍然有效,我们都不是“在b目录中”!
即使是这样的结构也是允许的......:
namespace a
{
namespace b
{
namespace c
{
int alpha = 5;
}
}
}
namespace b
{
namespace a
{
}
}
void main()
{
using namespace a;
}
请使用命名空间行为解释一下!
答案 0 :(得分:2)
写using namespace x;
只会将x
内的所有名称都带入当前范围。 x
中的名称可能包含其他名称空间的名称。
拿你的第一个例子:
#include <iostream>
namespace a
{
namespace b
{
namespace c
{
int alpha = 5;
}
}
}
int main()
{
using namespace a;
using namespace b;
using namespace c;
std::cout << alpha;
return 0;
}
首先,using namespace a;
在b
内提供名称main
。这样,我们就可以using namespace b;
c
,main
另外提供名称using namespace c;
。最后,我们可以alpha
使名称int main()
{
using namespace a;
using namespace b;
using namespace c;
using namespace b;
std::cout << alpha;
return 0;
}
可用。
现在是你的第二个例子:
b
前三行与以前一样,将名称c
,alpha
和using namespace b;
纳入范围。最后,重复b
没有任何效果,因为我们已经将alpha
中的所有名称都带入了范围。此外,using namespace b;
已被纳入范围,因此仍可在下一行使用。最终的.java
并没有以某种方式撤消这一点。
答案 1 :(得分:1)
使用命名空间有效地解包其内容。 这就是为什么“使用命名空间std;”允许你使用没有std ::前缀的“cout”。不要改变目录,而应将其视为将命名空间的内容移动到当前目录中。