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
};

你可能感兴趣的:(C++思考笔记(2):用const替代#define,用constexpr替代const)