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

目录

1.#define出错不好定位

2.使用cosnt代替#define的注意事项

2.1定义const指针

2.2定义类的专属常量

3.对比

4.使用inline和模板替换宏函数


1.#define出错不好定位

#define ASPECT_RATIO 1.653 

因为#define只是在预处理的时候进行宏替换,不会进入符号表,所以编译器压根不知道  ASPECT_RATIO,当你获得一个错误信息的时候他可能会提到 1.653,不会提到 ASPECT_RATIO,如果这个宏不是你自己定义的,你还要花费时间去追踪这个宏在哪个文件定义的。

2.使用cosnt代替#define的注意事项

2.1定义const指针

const char* const p = "hello"

定义const指针时,别忘了指针指向的内容也是不可更改的,所以要在*号的后面加个const。

2.2定义类的专属常量

class player
{
private: 
static const int NumTurns = 5;
int scores[NumTurns];
};

首先#define不提供任何的封装所以无法作为类的专属变量。

 在定义 static const int NumTurns = 5; 时如果你的编译不支持在类内进行初始化,可以使用匿名枚举(enum hack)或者 类内定义类外初始化。

class player
{
private: 
static const int NumTurns;
int scores[NumTurns];
};

const int player::NumTurns = 5;


// 匿名枚举

class player
{
private: 
enum {NumTurns = 5};
int scores[NumTurns];
};

3.对比

4.使用inline和模板替换宏函数

使用宏函数的主要目的就是减小栈的开销,但是宏函数的带来的问题太多了。

template<class T>
inline const T add(const T& a,const T &b)
{
    return a + b;
}

add他是一个真正的函数,会有参数类型的检查,会在调用处展开同样也不会有栈帧的开销。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值