条款02:尽量以const、enum、inline替换 #define
这个条款或许改为“宁可以编译器替换预处理器”比较好,因为或许 #define 不能被视为语言的一部分。那正是问题所在。
比如定义一个宏:
#define ASPECT_RATIO 1.653
这个ASPECT_RATIO也许从未被编译器看见。也许在编译器开始处理源码之前就被预处理器移走了。于是记号名称ASPECT_RATIO有可能没进入记号表内,当你运用此常量但获得一个编译器错误信息时,可能会带来困惑,因为这个错误信息也许会提到1.653而不是ASPECT_RATIO。
解决方法是用常量来替换宏:
const double AspectRatio = 1.653
作为一个语言常量,AspectRatio肯定会被编译器看到,当然就会进入记号表内。此外对浮点常量而言,使用常量可能比使用#define 产生的代码量少,因为预处理器“盲目地将宏名称ASPECT_RATIO替换为1.653”可能导致目标码出现多份1.653,若改用常量AspectRatio绝不会出现相同情况。
另外有时候代码用宏来定义一个简单的函数,比如:
#define RECTANGULAR_AREA(a, b) f(a*b)
当然上述写法是有问题的,之前在面试题库中就找到过类似的问题,当“a”是一个(2+3)这种形式的值时就会出错。
正确写法:
#define RECTANGULAR_AREA(a, b) f((a) * (b))
这里可以写一个inline函数来替换到该宏,就是一个简单的乘法运算。
template<typename T>
inline T rectanglarArea(const T& a, const T& b) {
return a*b
}
请记住
-
对于单纯常量,最好以const对象或enums替换#defines。
-
对于形似函数的宏(macros),最好改用inline函数替换#defines。
关于宏定义,一般从C转C++的开发者来说用用#define的习惯,但是宏定义主要是编译器不会对其进行检查,之后盲目的将对应记号替换成设定的值,这就要求开发者要足够小心,另外出现由#define引起的问题也很难排查,所以在开发过程中尽量避免#define是很好的建议。
上一篇: C++ 中typedef用法
下一篇: typedef的一些使用总结
推荐阅读
-
条款 02:尽量以 const, enum, inline 替换 #define
-
条款02: 尽量以const,enum,inline替换 #define
-
条款 02 - 尽量以const、enum、inline替换#define
-
条款02:尽量以const、enum、inline替换 #define
-
条款02:尽量以const、enum、inline替换#define
-
D45.1.0 尽量用const enum inline 替换 #define
-
条款02:尽量以const,enum,inline替换#define
-
Effective C++笔记之二:尽量以const、enum、inline替换#define
-
Effective C++ 条款02 尽量以const,enum,inline替换#define
-
《Effective C++》读书笔记 条款02 尽量以const,enum,inline替换#define