Effective C++ 条款02
尽量以const,enum,inline 替换#define。 Prefer const,emum,and inline to #define.
#define 是预处理器处理,不是编译器处理,换句话说,#define 处理的时间在编译之前。这样做的根本出发点在于有益于调试程序,当一个程序编译后,程序的内容全部会进入一个叫符号表的内存区域,但是#define的内容不会进入。所以如果程序编译出错后,这样对于我们来说,很容易混淆。
另外,这里记录一个让人容易混淆的问题。
我们有定义:
#define COMPARE(a,b) (a)>(b)?(a):(b)
int i=5,b=0
那么COMPARE(++a,b) 这里返回的是7,如果COMPARE(++a,b+10) 返回的会是10.
实际上这里需要理解define 的替代是这样做的:
(++a)>(b)?(++a):(b)
如果最后是a的值大,那么返回时,a会再计算一遍。