0、概述
1. 关于namespace
C++引入了命名空间namespace主要解决了多个程序员在编写同一个项目中可能出现的函数等重名的现象。
解决方法就是加上自己的命名空间。比如下面的例子:
|
#include
using
namespace
std;
namespace
space1
{
int
a=10;
}
namespace
space2
{
int
a=5;
}
void
main()
{
int
a=1;
cout<<
"space1定义的a="
<<space1::a<<endl;
cout<<
"space2定义的a="
<<space2::a<<endl;
cout<<
"主函数定义的a="
<<a<<endl;
}
|
上例中的“
space1::a”和“
space2::a”分别表示了调用
space1命名空间中的a变量和
space2命名空间中的a变量。这样的好处显而易见,那就是虽然
space1和
space2都定义了一个变量a,但是并不会出现重名的危险。
运行结果为:
2. 关于using namespace *
顾名思义,它就是说使用某个表空间,包括里面的函数,变量等。好处在于我们在程序里面就不用在每个函数的头上都加上*::来调用。比如说如果上面那个程序,如果我们不在using namespace std,那么我们就需要在主函数中的标准输出流cout函数前面加上std,写成std::cout表示调用std空间里面的标准输出流cout。但是有些时候我们也不能图这个方便,比如说如果在主函数中将命名空间
space1和
space2的中所定义的变量释放出来,如下例1:
|
#include
using
namespace
std;
namespace
space1
{
int
a=10;
}
namespace
space2
{
int
a=5;
}
void
main()
{
int
a=1;
using
namespace
space1;
using
namespace
space2;
cout<<a<<endl;
}
|
这个程序输出结果为:

如果我们在主函数中把 int a=1给删除,如下例2:
|
#include
using
namespace
std;
namespace
space1
{
int
a=10;
}
namespace
space2
{
int
a=5;
}
void
main()
{
using
namespace
space1;
using
namespace
space2;
cout<<a<<endl;
}
|
会发现根本就不会通过编译,输出的错误信息为:
error C2872: “a”: 不明确的符号
分析可以看出,上面这个例2会引起歧义。因为既使用的命名空间
space1里的a,又使用了命名空间
space2里的a,那么编译器就不知道到底哪个才是需要输出的a,自然就会引起歧义了。同理,在例1中,编译器同样不知道到底哪个才是需要输出的a,但是主函数的里的a覆盖了
space1,
space2里面的a,只会输出1。