将一组声明包裹在一个命名空间中就是为了避免可能的名字冲突,保持代码的局部性。
例如,一段代码示例:
#include "header.h"
namespace Mine
{
int a;
void f(){/*...*/}
int g() {/*...*/}
}
但是有时我们并不希望名字Mine被局部的环境之外知道,此时名字Mine似乎多余了,因此我们可以省去这个Mine名字 直接改写为:
#include "header.h"
namespace
{
int a;
void f(){/*...*/}
int g() {/*...*/}
}
以上也是合法的。但是,我们也必须存在某种方式,使我们可以从一个无名的命名空间之外访问其中的成员。因此,无名命名空间有一个隐含的使用指令。上面无名形式的声明等价于:
#include "header.h"
namespace $$$
{
int a;
void f(){/*...*/}
int g() {/*...*/}
}
using namespace $$$;
其中$$$是在这个命名空间定义所在的作用域里具有惟一性的名字,特别地,不同编译单位里无名命名空间也互不相同。
正如期望中那样,定义无名命名空间后,外部环境将无法说出无名命名空间的成员名字,即不让外界知道我的内部成员及调用。
参考资料:C++程序设计语言 原著:C++之父