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

条款02:尽量以constenuminline替代#define

@(EffectiveCpp)
  新建一个Global.h文件,将本来通过#define定义的变量,用constenum来定义;将通过#define定义的宏,用模板inline来代替。并将该Global.h包含到所有实现文件中,以模拟#define无视作用域的特点。

1,#define的特点

  • 无视作用域,一旦宏被定义,它就在之后的编译过程中一直存在(除非在某处被#undef)
  • 编译器不知道记号名的存在,例:
#define ASPECT_RATIO 1.653

在预处理阶段,所有ASPECT_RATIO均被替换为1.653,编译器不知道ASPECT_RATIO的存在。如果在代码中某位置报错,则显示的错误是1.653,而不是ASPECT_RATIO。如果ASPECT_RATIO被定义在不是用户编写的头文件中,这个错误可能会令用户不明所以。

2,以constenum来代替#define的变量定义

#define在变量定义中的功能就好像定义一个常量。用constenum替代合情合理。enumconst相比,enum只可以用来定义整数型(int,char,bool)。而且enum不允许访问常量内存。

3,以模板inline函数来替代#define定义的宏函数

#define定义的宏优点在于避免函数调用的开销和类型无关,前者通过inline来实现,后者通过模板实现。书中例子:

//以a和b中较大的调用函数m
#define CALL_WITH_MAX(a,b) f((a)>(b)?(a):(b))

改为模板inline

template<typename T>
inline void callWithMax(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、付费专栏及课程。

余额充值