Effective C++ 第二条 prefer const, enums and inlines to #define

使用const、enum定义常量而不用#define
在使用C++编程中如果我们需要定义一个常量c,在学习C语言的时候我们可能会保留#define C 1 这样的习惯,这是一种宏替换,我们尽量要使用如下操作来代替这一操作
使用inline修饰函数而不是用#define
当我们定义一个函数是使用函数f调用a,b中最大值的,这个时候不要用 #define CALL_WITH_MAX(a,b) f((a) > (b) ? (a):(b)),我们应该这样
这么做的好处与原因
要明白这个就要知道C/C++是如何从源文件(.c)转换成可执行文件的

源文件(.c)经过预处理生存(.i)文件,这一阶段源文件中的宏被替换为定义的内容,具体如下
也就是计算机根本不知道A是什么,在预处理阶段所有的A都被替换成了1,而const、enum是真正在内存中有A这么个变量。预处理阶段移除了#define的内容进行了宏替换,这里预处理会将stdio.h库中使用的函数定义放进来,printf函数在stdio.h中的。
到这里你可能会奇怪,这不是都一样吗?代码中的A被换成了1,但是一个文件可能有很多处,如果因为某处的1出了错误,编译的过程中报错显示的是1而不是A,这样就极其不方便你排查错误的原因。
同理用#define 定义 CALL_WITH_MAX 也是这个道理,一切调用CALL_WITH_MAX(a,b) 都被替换成了 f((a) > (b) ? (a):(b)),而利用inline创建的 callWithMax是个真正的函数,可以在符号表(symbol table)中查找到。