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

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值