1.对于单纯常量,最好以const对象或者enums替换#define;
2.对于形似函数的宏,最好改用inline函数替换#define;
这句话或许可以改为:“宁可以编译器代替预编译器”,因为#define不被视为语言的一部分,例如#define ASPECT_RATIO 1.656 定义了记号名称从未被编译器看见,有可能没进入记号表中,于是当运用此常量并且带来错误时无法定位到该记号名称,你会因为追终他而耗费时间,原因就是:你所用的名称可能未进入记号表中。解决方法就是以const常量替换宏,此外对于浮点数常量可能比#define导致更小的码,因为预编译器会盲目的将 ASPECT_RATIO替换,而出现多份1.656;。
#define无法创建class专属常量,因为#define不重视域,也不能提供封装性,但是const是可以的。
Enum hack的行为某方面比较像#define而不像const,有时候这个正是你想要的,例如取一个const的地址合法,取#define和enum就不合法了,如果你不想让别人获得一个pointer或者reference指向你的常量,那你可以用enum实现这个约束。enum和#define一样绝对不会导致非必要的内存分配。