在说明主题前,先描述#define的缺点:
1、#define定义的符号在预处理阶段,会被编译器替换成符号所代表的实际值。不利于程序的追踪。
2、#define没有作用域的概念。
3、#define表达能力有限。如:#define S(x) (x)*(x)。
欲解决问题,我们必须先了解什么情况会出现,为此,我们带着#define的使用展开,其使用可分为两种情况:
其一,如果#define仅仅是简单的符号定义,针对问题1,我们只需引入const修饰符或enum,不过根据#define使用的场合不同,具体的实现也不一样:
(a)当表达为全局常量或namespace常量时,直接用const修饰即可。
(b)当表达为类常量时,整型可定义为static const int…或enum {…}(enum hack),其他可定义为static const …,再在相应类实现里定义此常量。
解决了问题1,问题2也就迎刃而解。
另一种情况,如果#define是函数式定义,这种情况一般是为了节约函数调用开销,针对问题3,我们可以利用inline函数完美解决问题。
因此,尽量以const,enum,inline替换#define。