《C++语言教程》02章 名字空间


一、名字空间的定义

名字空间除了系统定义的名字空间之外,还可以自己定义,定义名字空间用关键字“namespace”,使用名字空间时用符号“::”指定。

  1. 不指定名字空间的变量或函数都是当前名字空间下的变量或函数。
  2. 不定义名字空间的情况下,都属于全局名字空间。
  3. 同一个名字空间可以定义多次。


#include <iostream>
using namespace std;

namespace na
{
    void print(int n) {     //与名字空间nb的函数名相同
        cout << "na::print: " << n << endl;
    }
}

namespace nb
{
    void print(int n) {     //与名字空间na的函数名相同
        cout << "nb::print: " << n << endl;
    }
}

namespace na     //同一个名字空间可以定义多次
{
    void print2(int a, int b) {
        print(a);
        print(b);
    }
}

int main ( ) 
{
    na::print(3);        指定na下的print函数
    nb::print(4);        指定na下的print函数
    na::print2(5, 6);    指定na下的print2函数

    return 0;
}

二、using的使用

使用“using namespace”可以使得后面不需要每次指定名字空间,相当于java中的import功能。不过,多次使用“using namespace”时,被指定的名字空间同时有效,很容易冲突。


#include <iostream>
using namespace std;

namespace na
{
    void print(int a) {
        cout << "na::print: " << a << endl;
    }
}

namespace nb
{
    using namespace na;
    void print2(int a, int b) {    //这是nb自身的函数
        print(a);    //na的函数
        print(b);    //na的函数
    }

    void print(int n) {    //这也是nb自身的函数
        cout << "nb::print: " << n << endl;
    }
}

namespace nc
{
    using nb::print2;    //指定只使用nb的print2()函数
    void print(int a, int b, int c) {
        print2(a, b);    //这是nb的函数
        nb::print(c);    //using中没有指定,所以这儿必须用nb::来指定
    }
}

int main ( ) 
{
    using namespace na;
    print(2);    //na的print()函数

    //using namespace nb;    //这样使用时,na和nb同时有效
    //print(3);              //编译系统不清楚究竟调用na和nb中的哪一个,因为函数名和参数相同

    using namespace nc;    //这样使用时,na和nc同时有效
    print(4, 5, 6);        //nc的print()函数的参数与na中的参数不同,所以这儿不出错。

    using nb::print;       //指定下面用的print()函数是nb的函数
    print(7);

    return 0;
}

三、用别名指定名字空间

名字空间可以一层层嵌套,指定时也得一层层地指定,这样很不方便,一般用别名代替就方便多了。


#include <iostream>
using namespace std;

namespace na {
    namespace nb {
        namespace nc {
            int sum(int a, int b)
            {
                return a + b;
            }
        }
    }
}

namespace A = na::nb::nc;

int main ( ) 
{
    cout << na::nb::nc::sum(5, 11) << endl;
    cout << A::sum(6, 12) << endl;

    return 0;
}

四、没有名字的名字空间

名字空间的名字也可以省略,称之为“无名名字空间”,无名名字空间经常被使用,其作用是“内部可以引用,而外部不能引用”。


#include <iostream>
using namespace std;

namespace na {
    namespace {     //无名名字空间
        int sum(int a, int b)
        {
            return a + b;
        }
    }

    int calc(int x, int y)
    {
        return sum(x, y);  //内部可以调用无名名字空间的变量或函数
    }
}

int main ( ) 
{
    //cout << na::sum(5, 11) << endl;  //因为缺少里面的名字,所以外部不能调用
    cout << na::calc(6, 12) << endl;

    return 0;
}