条款02:尽量以const, enum, inline 替换 #define 【读书笔记 Effective C++】

 

#define ASPECT_RATIO 1.653

 

 

基础知识:

(1)宏定义#define NAME Value 是预处理器处理,编译器无法看到NAME,没有进入记号表(symbol table)中。

 

存在问题:

(1)当运用该常量获得一个编译错误信息时,由于ASPECT_RATIO不在symbol table中,那么编译错误提示1.653而不是ASPECT_RATIO。如果ASPECT_RATIO被定义在一个非你写的头文件内,你将为追踪它而花费时间。

(2)产生过多的目标代码(object code),因为预处理器会将所有ASPECT_RATIO都替换为1.653

(3)宏函数虽然简便,不会导致函数调用带来的开销,但容易误用

 

解决方法:

(1)使用常量替换宏

const double AspectRatio = 1.653

 

(2)对于class 专属常量,为了将常量的作用域限定在class内,那么它既要是class的一个成员,又要保证此常量至多只有一份实体,可以使用静态成员:

static const int Count = 5;

或:

enum {Count = 5};

 

(3)对于宏函数,使用inline函数替换

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

替换为

template<typename T>

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

{

    f(a > b ? a : b);

}

这样做的好处:

a. 不需要考虑为函数参数加上过多的括号

b. 不用担心参数被计算多次(如宏函数中a++)

c. 可以控制作用域和访问规则(比如该函数可以是class 成员函数)

 

注意:

对于字符串常量一般写为

const string authorName("Scott Meyers");

而不写成(避免多个const)

const char *const authorName = "Scott Meyers";

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值