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

一 :对于单纯常量,最好以const对象或者enums替换#define

 之前我们常用的定义宏的方式是:

#define ASPECT_RATIO 1.653

这样做潜在的问题是,可能记号名称ASPECT_RATION 在编译器编译源码之前,已经被预处理器移走了,运行时可能获得一个编译错误信息,这个错误信息可能会提示1.653而不是ASPECT_RATION,导致你对1.653来自何处毫无概念。解决方法是使用一个常量替换上述的宏:

const double AspectRatio = 1.653

作为一个常量,AspectRatio肯定会被编译器看到。

另一个值得关注的点是类内的常量。

为了将常量的作用域限制于class内,必须让它成为一个member,为了确保只有一份,必须让它成为一个static成员:

class GamePlayer
{
    private:
         static const int NumTurns = 5; //常量声明式
         int scores[NumTurns];//使用该常量
};

(如果编译器报错找不到定义,需要在cpp文件中提供如下定义)

const int GamePlayer::NumTurns;

声明时已经设置初值了,这里不需要再设置初值。

二:对于形似函数的宏,最好改用inline函数替换#define

我们经常用#define去定义宏,例如:

#define CALL_WITH_MAX(a,b) f((a) >(b)? (a):(b))

对于这样的宏看起来就让人很头疼。

并且调用还会产生意想不到的结果:

int a =5, b=0;
CALL_WITH_MAX(++a, b);//a被累加两次
CALL_WITH_MAX(++a, b+10);//a被累加一次

幸运的是我们有更好的方法替换以上宏:

template<typename T>
inline void callWithMax(const T& a, const T& b)
{
    f(a>b? a: b);
}

这个template产出一整群函数。

参考:Effective C++ 中文版

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值