c++中无名命名空间的使用

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数据成员