同一个作用域只能存在一个变量的声明,不管这个变量属于哪个命名空间。
举例:
#include <stdio.h>
#include <errno.h>
int a = 0;
namespace ns1
{
int a = 1;
}
namespace ns2
{
int a = 2;
}
using ns1::a;
int main(void)
{
printf("a=%d\n", ns1::a);
return 0;
}
编译:
namespace.cpp:16:12: error: ‘int ns1::a’ conflicts with a previous declaration
using ns1::a;
^
namespace.cpp:4:5: note: previous declaration ‘int a’
int a = 0;
^
程序最开始的int a = 0; 属于全局命名空间,程序16行同时可见两个同名变量,冲突发生。
局部代码范围的局部变量可以优先于外部命名空间的变量
举例:
#include <stdio.h>
#include <errno.h>
int a = 0;
namespace ns1
{
int a = 1;
}
namespace ns2
{
int a = 2;
}
using namespace ns1;
using namespace ns2;
int main(void)
{
int a = 3;
printf("a=%d\n", a);
return 0;
}
编译运行:
a=3
局部区域可以使用using XXX::yyy语句,从而使该命名空间的变量的作用域在当前局部区域,局部区域外的其他命名空间的同名变量不起作用。
#include <stdio.h>
#include <errno.h>
int a = 0;
namespace ns1
{
int a = 1;
}
namespace ns2
{
int a = 2;
}
using namespace ns1;
using namespace ns2;
int main(void)
{
using ns1::a;
printf("a=%d\n", a);
return 0;
}
运行结果:
a=1
多个文件共用一个命名空间时,命名空间的内容会进行合并。
例如:
namespace.cpp
#include <stdio.h>
#include <errno.h>
int a = 0;
namespace ns1
{
int a = 1;
}
namespace ns2
{
int a = 2;
}
namespace ns3
{
extern int n3;//from ns3.cpp
int b = 4;
}
using ns3::b;
using ns3::n3;
int main(void)
{
using ns2::a;
printf("a=%d, b=%d, n3=%d\n", a, b, n3);
return 0;
}
ns3.cpp
#include <stdio.h>
#include <errno.h>
namespace ns3
{
int n3 = 3;
}
编译运行:
g++ -o namespace namespace.cpp ns3.cpp
$ ./namespace
a=2, b=4, n3=3