关于名称空间的一些知识点

1、名称空间是开放的,可以从多个分离的名称空间中向名称空间添加内容,如:

namespace A
{
    void fun01();
}

namespace A
{
    void fun02();
}

名称空间A中有两个函数。这个特性非常有用,可以使不同文件中的函数置于同一个名称空间。

2、同名的变量:

namespace space
{
    int a = 111;
}

int a = 666;

#define debug qDebug()<<
int main(int argc, char *argv[])
{
    int a = 444;
    debug "局部 " << a;
    debug "全局 " << ::a;
    debug "名称空间 " << space::a;
}

对于名称空间和全局变量同名的情况,如果用using显示指明,那名称空间的变量会屏蔽全局变量:

namespace space
{
    int a = 111;
}

int a = 666;

#define debug qDebug()<<
int main(int argc, char *argv[])
{
    using space::a;
    ++a;
    debug "a = " << a;
}

这里指明了a是space中的a。对于局部变量则不行:

3、名称空间的别名,如果一个名称空间名字很长可以设置别名代替:

namespace IAnALongNamespace
{
    int a = 999;
}

#define debug qDebug()<<
int main(int argc, char *argv[])noexcept
{
    namespace space =  IAnALongNamespace;
    debug space::a;
}

4、名称空间与版本管理

设想如下应用场景:有个函数要更新为新版本,但是旧版本在很多地方使用了不能换,使用名称空间可以让新旧版本共存且只要做最小的改动而不必大量复制:

namespace bigSpace
{
    inline namespace V2_0
    {
        void fun()
        {
            qDebug()<<"fun 2.0";
        }
    }

    namespace V1_0
    {
        void fun()
        {
            qDebug()<<"fun 1.0";
        }
    }
}

#define debug qDebug()<<
int main(int argc, char *argv[])noexcept
{
    bigSpace::fun();
    bigSpace::V1_0::fun();
}

加inline的表示使用同名的函数时默认用的V2_0里面的。这种返回值参数都一样的情况不能用重载,使用名称空间就很简单。

5、匿名名称空间,只能当前编译单元可访问:

namespace
{
    int a = 999;

    namespace
    {
        int b = 888;
    }
}

#define debug qDebug()<<
int main(int argc, char *argv[])noexcept
{
    debug a;
    debug b;
}

猜你喜欢

转载自blog.csdn.net/kenfan1647/article/details/114125836