条款二之尽量以const、enum、inline、替换#define

#define不被视为语言的一部分,这正是问题所在。

例如

#define ASPECT_RATIO 1.653

记号名称也许从未被编译器看见,也许在编译器开始处理源码之前它就被预处理器移走了。因此,它可能没被记入记号表内。

解决方法:

用一个常量替换上面的宏(#define)

const double AspectRatio = 1.63;

作为一个常量,肯定会被编译器看到,因此,会记入记号表中。此外,使用常量可能比#define导致更小量的码,因为预处理器“盲目将宏名称替换为1.63”可能导致目标码出现多份1.63。

常量替换#define两点注意

  • 定义常量指针:
const char *authorName = “Shenzi”;
cosnt std::string authorName("Shenzi");
  • 类专属常量:
static const int NumTurns = 5;//static 静态常量 所有的对象只有一份拷贝。

取一个const的地址是合法的,但取一个enum的地址就不合法,而取一个#define的地址通常也不合法。如果你不想让别人获取一个pointer或reference指向你的某个整数常量,enum可以帮助你实现这个约束。

例:

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

用模板替换:

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

 请记住:

  • 对于单纯常量,最好以const对象或enums替换#defines;
  • 对于形似函数的宏,最好改用inline函数替换#defines。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值