effective c++阅读之旅---条款2

条款2:尽量用const,enum,inline 对#define进行替换

案例一:

#define ASPECT_RATIO   1.653

这种预定义宏,并未进入符号表,只是符号替换,更别提错误检查!非常不安全!

替换方法: const double Aspect_Ratio = 1.653

这种定义const常量,会进入符号表,会进行错误检查,会分配内存


案例二:类内部使用的常量

//Game.h文件中
class Game
{
private:
	static const int NumTurns = 5; //常量声明式	
	int scores[NumTurns];
}

//低版本编译器需要加,高版本编译器甚至不需要
//Game.cpp文件中
const int  Game::NumTurns ; //定义

//假设上述int scores[NumTurns]; 低版本编译器不允许这样设定
替代方案如下,俗称enum hack惯用法

class Game
{
private:
	enum { NumTurns = 5 } ; //俗称 enum hack
	int scores[NumTurns];
}

案例三: 使用inline+模板的形式避免一些常用的宏函数

例如:以a和b的最大值调用f

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

当此时我们使用一下代码,会出现不可思议的事!!

int a = 5 , b= 0;
CALL_WITH_MAX(++a,b);  

结果: a在第一个调用被累加两次

为了避免这样的情况,怎么做呢?
如下:

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

通过内联和函数模板,往往我们可以取代这些简短宏函数,来保证安全性!

总结:
1、用enums 和 const 替换#define
2、用inline和函数模板替换宏函数

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值