条款02:尽量使用const、enum、inline替换define

发布时间 2023-06-22 10:42:08作者: u_lihao

文中说用enum代替define,只能说算是define在定义常量时的一种替代品,不能说明两者有何优劣。所以重点还是在const和inline vs define。

const vs define: 为什么建议用const而非define?

  1. define定义常量的局限性:
    • 符号是否在编译器可见。define定义的常量在预处理阶段进行宏替换,符号在编译期将不可见。而const常量会在编译期进行类型检查、链接,相关符号存储在符号表中。
  2. const产生的额外开销很小:
    • 首先说内存占用方面,const常量需要为其分配一个对象内存。当然,如果没有指针或引用对其进行解引用操作,优秀的编译器可以不为其分配内存。
    • 访问开销。编译器会采用常量传播进行代码优化,即将const常量替换为具体的数值,这一点和define相似,没有额外的访问开销。

inline vs define: 为什么建议用inline而非define?

  1. 宏函数的问题。
    • 每个符号都必须用括号括起来;
    • 通过表达式传递可能会引起变量重复核算。具体示例如下:
#define MAX(a,b) (a)>=(b)?(a):(b)

a = 0, b = 1
MAX(++a,++b)  // b将被核算两次
  1. inline产生的额外开销。一般对于短小的inline函数会在编译期进行内联展开,不会产生额外的函数调用开销。

经验准则

  1. 对于单纯常量,最好是以const对象或者enums替换#define。
  2. 对于形似函数的宏(macros)最好改用inline函数替换#define