C++命名空间:namespace

摘自C++ Primer

引入原因

当应用程序用到多个供应商提供的库时,不可避免地会发生某些名字相互冲突的情况。多个库将名字放置在全局命名空间中将引发命名空间污染。

命名空间定义

为防止名字冲突提供了更加可控的机制。命名空间分割了全局命名空间,其中每个命名空间是一个作用域。

使用规则

只要是出现在全局作用域中的声明,都可以在命名空间中定义,例如:类、变量(初始化及其操作)、函数(及其定义)、模板、定义子命名空间
namespace ($name){
class a{//};
int a_;
a a_1;
}
命名空间中的名字必须在定义它的作用域内保持唯一。以类为例,如果在某个命名空间中定义了class a, 那么在该命名空间中便不能再定义变量a或模板a
命名空间可以是不连续的。例如在一个命名空间需要定义多个类,又由于单个类的定义可以放在单个.h文件中,那么当一个类已经定义在该命名空间之后,下一个类的定义可以继续扩充该命名空间:例如test_1.h和test_2.h

namespace test{
    class test_1{
        /*
        */
    };
}
namespace test{
    class test_2{
        /*
        */
    };
}

未命名的命名空间

用namespace后紧跟花括号括起来的一系列声明语句。
1.未命名的命名空间中定义的变量拥有静态生命周期:在第一次使用前创建,并且直到程序结束才销毁
这意味这在一个文件中定义好了未命名的命名空间后,该命名空间中定义的所有对象仅在该命名空间中有效,其作用范围无法跨越多个文件。个人理解为因为是未命名,所以在using时无法指定未命名空间中的对象,所以这些对象的作用域仅限于其定义的文件。
2.C++11中取消了在文件中声明static的全局实体,现在利用未命名的命名空间来实现静态的全局变量

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值