1. 命名空间作用
命名空间是程序设计者命名的内存区域
,程序设计者根据需指定一些有名字的空间域,把一些全局实体分别存放到各个命名空间中,从而与其他全局实体分隔开。
通俗的说,每个名字空间都是一个名字空间域,存放在名字空间域中的全局实体只在本空间域内有效。名字空间对全局实体加以域的限制,从而合理的解决命名冲突。命名空间就是为了避免可能的名字冲突,保持代码的局部性。例:
namespace Mine
{
int a;
void f(){/*...*/}
int g() {/*...*/}
}
可用using使用命名空间中的变量
using后面的命名空间成员名必须是有命名空间限制的名字
例:
using Mine::a;
这样每次使用Mine中的成员时都必须加上using Mine::变量名,
如果Mine中的成员较多则可以直接
using namespace 命名空间名
声明了在本作用域中要用到命名空间中的成员,在使用该命名空间内的任何成员时都不必使用命名空间限定。
2. 无名命名空间
但是有时我们并不希望名字Mine被局部的环境之外知道,此时名字Mine似乎多余了,因此我们可以省去这个Mine名字 直接改写为:
namespace
{
int a;
void f(){/*...*/}
int g() {/*...*/}
}
完整:
#include<iostream>
using namespace std;
namespace
{
int a;
void f(){cout<<"a";}
int g() {return 1;}
}
int main()
{
f();cout<<endl;
cout<<g()<<endl;
}
/*
a
1
*/
定义无名命名空间后,外部即不能得知无名命名空间的成员名字,即不让外部知道我的成员名字及其调用
由于没有名字,所以其它文件无法引用,它只能在本文件的作用域内有效,
它的作用域:重无名命名空间声明开始到本文件结束。在本文件使用无名命名空间成员时不必用命名空间限定。其实无名命名空间和static是同样的道理,都是只在本文件内有效,无法被其它文件引用。
note:
- 无名命名空间允许无限定的使用其成员函数,并且为它提供了内部连接(
只有在定义的文件内可以使用
) - 命名空间不需要命名,它的成员不需要限定就可以使用。
- 如果在一个文件中包含了两个相同成员的无名命名空间,其含义是不明确的,会导致重复定义的错误。
无名命名空间可以替代全局作用域的static数据成员