尽量以const、enum、inline替换#define

许久以来,在程序设计的世界里我一直处于羸弱的姿态,习得代码的外貌却深入不到它的精髓,对于一些设计技巧基本不去研究,因此代码看起来毫无章法,混乱至极。要想成为一个大师级人物,就要有章有法,写出有意味的code。因此决心潜下心来学习c++程序的设计技巧,通过几本书来学习它,完善自身。

门外万物皆是空,应以不变应万变。


替换#define,并不是替换所有的#define,而是某些情况下#define显得并不怎么规范,且会造成代码的混乱,这是应该遭受禁止的。


#define TEMP  1.56  ,当你做出这个事的时候,是采用了预处理器,程序在编译前,所有的TEMP会被替换成1.56,所以当编译出现错误时,编译器显示的错误信息为1.56,而不会是TEMP,这会造成困扰。

一种解决方法是,使用const来替换上述的宏(#define) const double TEMP = 1.56; 

当 宏为  #define TEMP "darren"   时,应以  const char * const TEMP = "darren";  来代替,或使用string对象: const std::string TEMP("darren");  来代替。


在c++中,有时我们需要在类中声明一个数组 array成员,数组的大小一般也被定义死了,你可能会这么定义: 

#define TEMP 5

class A

{

……

private:

array[TEMP];

}

可用enum来代替这种宏的写法。

class A

{

……

private:

enum{ Num = 5};  //令Num成为5的一个记号名称

array[Num];

}

这种写法其实更为常见,比较实用。


#define还经常用于实现类似于函数的宏,如: #define GET_MAX(a,b)   f(  (a) > (b) ? (a) : (b)  )

这样的宏,真的很难看,据说它还会出现下述的bug:

int a = 5, b = 0;

GET_MAX(++a,b)   //a被累加2次;

GET_MAX(++a,b+10)  //a被累加1次;

这宏太危险了,直接用函数代替就好,用template inline 函数代替就显得简洁得多:

template<typename T>

inline void GET_MAX(const T& a, const T& b)

{

f( a > b? a : b );

}

这个模板函数将产生出一堆来比较相同类型的参数大小的函数,够用了。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值