第二条的内容记忆得就不如第一条丰富了,:-)
核心思想:不要使用#define!
一般的,#define有两个用途:1. 定义常量,2.定义常用操作,例如max(a,b)。
#define用途一的替代方案是:const变量。好处一是:宏定义是预编译处理的,只是做简单的文本替换,宏定义token不在编译符号表支持,而const能在编译期检查类型。好处二是,C++可以定义类的cosnt变量,进一步提高封装性[1]。
#define用途二的替代方案是:内联函数模板(inline template function),其中inline不牺牲效率,template以类型安全的方式实现函数的通用性。
[1]是展开说明的语言特性。老的C++编译器对类内const需要声明并定义。为了书写方便并且兼容老编译器,可以采用类内enum定义来替代const。两者之间还有一个细微的差别,enum是无法取地址的,const是可以取地址,故enum更像#define。
最后Meyers谈到,尽管不建议使用#define,但是预编译器还没有到退出历史舞台的地步。例如,#ifdef用于条件编译是必要的,更不用说#include了。
结合《重构》加两条:参见8.9节的“符号常量代替魔法数”;3.2节“过长函数”坏味道,故小函数是十分有益的。