[Effective C++ --002]尽量以const,enum,inline替换#define

一、尽量以const,enum,inline替换#define(或以编译器代替预处理器)

1)#define在N-Orca中的应用

2)Const替换 #define
首先经常会 #define ASPECT_RATO 1.63
由于记号ASPECT_RATO有可能不被计入记号表内,所以当编译发生错误时,可能会带来困惑。(尤其是在ASPECT_RATO为非自己所写的的时候)
解决方法:
const double aspectRato = 1.63;
这些写,aspectRato肯定会被编译器看到。
而且使用常量可能比使用#define导致更少的目标码。(因为预处理器会将ASPECT_RATO替换为1.63)

用了Const来定义常量时,通常以下格式:
static const int num = 5;

#define 不能定义一个Class的专属常量,应为#define不重视作用域。一旦宏被定义,在其后的编译构成中就有效。

3)enum替换 #define
但当你的Class的专有成员不希望被取其地址,或引用的时候。可以通过enum来实现。
class A
{
private:
enum { num = 5 };
int a[num];
}
因为取一个enum的地址是不合法的

4)inline替换 #define
首先看一个例子:

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

使用方法:
int a = 5 , b = 0 ;
CALL_WITH_MAX(++a,b)
CALL_WITH_MAX(++a,b+10)
以上,调用又有什么后果呢?

可以用templte inline来替换以上实现,如下:
template<typename T> inline void callWithMax(const T& a, const T& b)
{
f(a > b ? a : b);
}

总结:
1)对于单纯的变量,最好以const或enums替换#defines。
2)对于形似函数的宏,最好改用inline函数替换#defines

posted @ 2012-10-19 10:37  依然冷月  阅读(193)  评论(0编辑  收藏  举报