项目心得-C++的命名空间你真的会用了吗?

说到命名空间,很多初学者会马上联想到IOSTREAM里的COUT  CIN  ENDL 

他们是每本教程最早出现的关键字,也许你会知道命名空间的基本知识,能够理解命名空间的写法,定义,以及特殊的用法.但能够把命名空间很好的运用到软件项目上除了你要有很好的基础 还要对命名空间的存在的理由要理解透彻!

今天在单位加班,发现我所做的项目太多的函数定义了同样类型的变量,要是内置类型我也就睁只眼闭只眼了,但定义的全是SIZEOF()后能占用很大内存的对象.于是我便构思:把他们都定义成全局的CURRENT的变量,这样的确能减少对象的构造,但却暴露了数据.即使我是新手,但还是知道模块化的重要性. 定义一个类?的确能够把数据很好的组织在一起,并且隐藏了数据.但是当需要使用数据的时候,即使是在简短的一个RETURN 函数 在汇编中同样是要CALL到成员函数中的.要是小程序也就无所谓了但这个工程对文件的读取的时候要调用成千上万次,PROFILE后的数据多的吓人.于是我决定通过NAMESPACE来模块化这些通用的变量.

我几下就把命名空间的代码写好,并在多个文件和下维护着它.忽然在另一个工程了想扩展这个NAMESPACE的时候发现能够重复定义.也许是多个工程的缘故把.但最后更令我头疼的事情来了.我在一个文件下有这样的代码

namespace currentvariable

{

                  typename      a ;             //类型名我用TYPENAME了

                  typename      b;

                     ....

}

如果另一个文件想使用A  却出现错误,如果在使用A的这个文件从新在NAMESPACE中定义A首先会是重复定义.其次也就失去了使用NAMESPACE的意义了.后来经过思考,终于搞定了,其实命名空间就想全局区域一样,如果想要在另一个文件下使用要在NAMESPACE中使用EXTERN的.尽管要用EXTERN声明,但你还是不能试图在同一命名空间下定义多个同名同类型的对象的.就想全局变量一样,所以含有定义对象的空间定义是不能在.H中的,因为定义不象类和INLINE函数那样具备同名单一定义规则.于是忽然发现,自己看书不实践是不行的,以前看的TCPL里明明讲了的,却自己折腾了一个小时.于是回家又翻了一下TCPL.才想起来那会学的是多么扎实,但现在那.......

更好的是把所有的定义放在.CPP里,并且在.H中的NAMESPACE里用EXTERN.定义变量还是函数都最好直接生命MAPESPACE:: 来定义.而不要打开命名空间,这样,如果空间中没有声明会报错的.避免你无意的往空间里加入你其实并不想加入的变量或函数.所以总结起来就是.H中的命名空间都是声明..CPP空间包含它,并在其中的.CPP中定义它.并且最好不要打开命名空间,而是应该直接生命作用域.

比如我们用到的IOSTREAM  它的STD::COUT  和STD::CIN 应该是这样设计的.

//IOSTREAM.H  我们不考虑派生关系

namespace std      //源码中把STD {  用了TYPEDEF    但我们不考虑这些

{

    extern istream cin;

    extern ostream cout;

    class istream ;

    class ostream;

}

 

//iostream.cpp

#include <iostream>    要包含.

std::istream  std::cin;

std::istream  std::cout;

class std::istream {    ...   };

class std::ostream {    ...   };

 

当然同样可以在一个NAMESPACE里EXTERN 其他NAMESPACE里的变量.... 但一定要写出作用域,或是用 使用声明的方法.

如果要定义内部连接特性的变量 就在无名空间中进行,这个大家都应该知道.

希望大家能总结一下 对比全局作用域 你就会发现有很多相同点的.

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值