用const替代#define
在«effective C++»中,条款2指出
尽量使用const,enum,inline替代#define
当程序中需要定义一些常量的时候,用const
比用#define
要好:因为#define
是属于预处理器的语法,只是简单地进行宏替换,而const
是C++编译器的语法,能提供类型检查以及调试信息
以前看到这个知识点也没多想,平时就直接用了,经常在头文件用const
来定义全局常量。但其实这里面还涉及到另一个知识点,那就是为什么在头文件定义的const
全局变量不会出现符号冲突的问题。后来仔细看«C++ Primer»才知道const
全局变量默认是拥有内部链接属性的,也就是说以下两种全局变量的定义等价:
//这两行定义等价
const T MAX;
static const T MAX;
要让const
全局变量拥有外部链接属性需要手动添加extern
关键字
用constexpr替代const
C++11引入constexpr
来区分出编译期常量。由于很多场景需要的不仅仅是常量,而是编译时期就能知道值的常量,比如数据的大小,模板类的整型参数,设置alignment内存对齐,switch中的标签等等。
const
没有从语义上区分出是否为编译期常量,这样可能就会造成编译器会为编译期常量开辟全局存储空间,并且不允许类内初始化静态非整型变量:
class Foo {
public :
static const double PI = 3.14; //不允许类内初始化静态非整型变量
static constexpr double PI = 3.14; //OK
};
网友评论