20180302 C++ 使用#define带来的问题及解决方法(const enum inline)
情况1:当使用如下定义:
#define RATE 1.66
当你运用此常量但获得一个编译错误信息时,可能会带来困惑,因为这个错误信息也许会提到1.66而不是RATE,如果RATE被定义在一个非你所写的头文件中,你肯定对1.66以及它来自何处毫无概念,于是你将因为追踪它而浪费时间,解决方法如下:
const double rate = 1.66;//大写名称通常用于宏,小写名称适用于变量,因此这里改变名称写法
情况2:#define常常错误的实现宏
eg:
#define CALL_WITH_MAX(a,b) f((a) > (b) ? (a) : (b))
无论何时写出这样的宏,都要为宏中的所有实参加上小括号,否则可能会在表达式中调用这个宏时 会遭遇麻烦,但即使加上小括号,也可能出错,如下:
int a = 5,b = 0;
CALL_WITH_MAX(++a,b);//a被累加两次
CALL_WITH_MAX(++a,b+10);//a被累加一次
在这里,调用f之前,a的递增次数竟然取决于“它被拿来和谁比较”(啥意思???)
用以下方法解决(template inline函数)
template<typename T>
/*由于我们不知道T是什么,
所以我们采用pass by
reference-to-const */
inline void callWithMax(const T& a,const T& b)
{
f(a > b ? a : b);
}
总结:1、对于单纯常量,最好以const对象或enums替换#define
2、对于形似函数的宏(macros),最好改用inline函数替换#define