C++思考笔记(2):用const替代#define,用constexpr替代const

用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

};


服务资讯详情
且的笔画顺序分布演示: