《Effective C++》阅读笔记 条款02:尽量以const,enum,inline替换 #define


条款02:尽量以const,enum,inline替换 #define

Prefer consts, enums, inlines to #define

宁可用编译器替换预处理器

个人理解是defines更类似于文本的替换。另外defines也会有自己的妙用,没必要过于死板(说个比较离谱的例子就是头文件嵌套时的重复定义问题可以通过条件编译开关来避免)

  • 例如:
#define Add(a,b) a+b;

在一般使用的时候是没有问题的,但是如果遇到如:c * Add(a,b) * d的时候就会出现问题,代数式的本意是a+b然后去和c,d相乘,但是因为使用了define(它只是一个简单的替换),所以式子实际上变成了
c * a + b * d

另外,相较于前三者,defines在调试时会一定程度上增加难度。

  1. const:
    “#define直接替换导致名称从未被编译器看到”
    const定义常量也可能比#define导致较小量的码
    “#define不重视作用域,故不提供封装性”
  2. enum:
    取一个const的地址是合法的,但取一个enum的地址不合法。因为enum hack的行为某方面说比较像#define而不是const
  3. inline:
    “#define定义函数可能招致误用,最好用inline函数替换 //todo”