条款02:尽量以const
,enum
,inline
替代#define
@(EffectiveCpp)
新建一个Global.h
文件,将本来通过#define
定义的变量,用const
或enum
来定义;将通过#define
定义的宏,用模板inline
来代替。并将该Global.h
包含到所有实现文件中,以模拟#define
无视作用域的特点。
文章目录
1,#define
的特点
- 无视作用域,一旦宏被定义,它就在之后的编译过程中一直存在(除非在某处被
#undef
) - 编译器不知道记号名的存在,例:
#define ASPECT_RATIO 1.653
在预处理阶段,所有ASPECT_RATIO
均被替换为1.653
,编译器不知道ASPECT_RATIO
的存在。如果在代码中某位置报错,则显示的错误是1.653
,而不是ASPECT_RATIO
。如果ASPECT_RATIO
被定义在不是用户编写的头文件中,这个错误可能会令用户不明所以。
2,以const
,enum
来代替#define
的变量定义
#define
在变量定义中的功能就好像定义一个常量。用const
,enum
替代合情合理。enum
和const
相比,enum
只可以用来定义整数型(int,char,bool
)。而且enum
不允许访问常量内存。
3,以模板inline
函数来替代#define
定义的宏函数
#define
定义的宏优点在于避免函数调用的开销和类型无关,前者通过inline
来实现,后者通过模板实现。书中例子:
//以a和b中较大的调用函数m
#define CALL_WITH_MAX(a,b) f((a)>(b)?(a):(b))
改为模板inline
template<typename T>
inline void callWithMax(const T& a, const T& b)
{
f(a>b?a:b);
}