条款02:尽量以const,enum,inline替换#define

#define不被视为语言的一部分。

#define ASPECT_RATIO 1.653

ASPECT_RATIO也许从未被编译器看见;

也许在编译器开始处理源代码之前它就被预处理器移走了。

所以ASPECT_RATIO有可能没进入记号表(symbol table)内。当发生编译错误时会带来困惑。如果ASPECT_RATIO被定义在一个非你所写的头文件内,追踪起来会浪费时间。

解决方法:

const double AspectRatio=1.653

作为一个语言常量,AspectRatio肯定会被编译器看到,当然就会进入记号表内。


作为class专属常量,为了将常量的作用域(scope)限制于class内,必须让它成为class的一个成员;而为确保此常量至多只有一份实体,必须让它成为一个static成员:

class GamePlayer{

private:

    static const int NumTurns=5;      //常量声明式

    int scores[NumTurns];                 //使用该常量

};

通常C++要求你对你所使用的任何东西提供一个定义式,但如果它是个class专属常量又是static且为整数类型,则特殊处理。

只要不取它们的地址,可以声明并使用它们而无须提供定义式。

但如果你取某个class专属常量的地址,或纵使你不取其地址而你的编译器却坚持要看到一个定义式,你就必须另外提供定义式:

const int GamePlayer::NumTurns;   //NumTurns的定义

把这个式子放进一个实现文件而非头文件。

当你在class编译期间需要一个class常量值,例如数组声明式。编译器不允许"static 整数型class常量"完成“in class初值设定”,可以改用"the enum hack"补偿做法:

class GamePlayer{

 private:

    enum{NumTurns=5};

    int scores[NumTurns];

};


另一个#define误用情况,是用他来实现宏
例:
#define CALL_WITH_MAX(a, b) f((a) > (b) ? (a) : (b))
int a = 5, int b = 0;
CALL_WITH_MAX(++a, b); //a累加两次
CALL_WITH_MAX(++a, b + 10); //a累加一次

改用template inline函数代替

template<typename T>

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

{

    f(a>b?a:b);

}


请记住

》对于单纯常量,最好以const对象或enums替换#defines。

》对于形似函数的宏(macros),最好 改用inline函数替换#define。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值