1) 命名空间与class/struct等的区别
l namespace是用来解决C/C++中的名字冲突的;
l 只能在全局空间定义,也就是说不能在函数里或类里定义
l 结尾不用加分号
namespace A
{
}
l 可以在不同文件定义同样名称的名字空间,系统会合并
l 命名空间可以有别名,用于缩短名字,方便书写
namespace bbbbbbbbbbbbbbbbb
{
}
namespace a = bbbbbbbbbbbbbbbbb;
2) 匿名命名空间的作用
l 每个文件(编译单元)可定义一个匿名空间
namespace
{
int a;
}
在编译以后,其实编译器会加一个唯一的名字
_UNIQUE(类似GUID)。
然后加一个指令using namespace _UNIQUE;
l 用于替代static
1) 新C++标准提倡使用匿名命名空间来替代static,因为static容易使人混淆(C++和C对static的定义是不一样的)
2) static不能用于修饰class,所以你不能防止在另外一个文件使用这个类
3) 命名空间的使用
l 用全名访问
如A::B::a = 1;
l 引入一个命名空间的所有名字
using root;
l 指定使用某个名字
using root::Func;
4) 注意事项
l 如果不注意正确使用using,就会使得namespace失去了这种名字冲突保护。using指令只是在当前文件引入名字,但是如果在头文件中,会被很多文件引入。
所以,如果using会引入一个空间所有的名字,一般不放在头文件中。
l 匿名空间的友员函数
namespace A
{
Class B
{
friend void Func();
};
}
void A::Func(){}
Func必须属于namespace A,即要在里面实现。