美文网首页C++思考笔记
C++思考笔记(2):用const替代#define,用cons

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

作者: RC_HT | 来源:发表于2019-10-19 20:38 被阅读0次

用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,用cons

    用const替代#define 在«effective C++»中,条款2指出 尽量使用const,enum,in...

  • #define和const

    c语言只有#define,c++可以用#define和const来定义常量。const比#define更具优势。 ...

  • 第八章 常量

    简介:使用关键字const和volatile 8.1 值替代 应该完全用const取代#define的值替代 C+...

  • Effective C++

    Effective C++ 的忠告: 尽量用const和inline,而不用#define,即尽量用编译器,而不用...

  • #define宏常量和const常量的区别

    C++ 语言可以用const来定义常量,也可以用#define来定义常量。但是前者比后者有更多的优点: const...

  • 顶层const

    说到顶层const(top-level const)在c++ primer 第五版里面有介绍到 用名词顶层cons...

  • 小知识

    一. 二.尽量用const代替#define const int a = 10; define a 10; ...

  • 宏定义和常量定义的区别 (转)

    1.效果-《高质量C++/C编程指南》 C++ 语言可以用const 来定义常量,也可以用#define 来定义常...

  • C++ const 关键字

    C++有两种第一常量方式:#define const; 两种方式区别:1.宏定义是字符替换,没有类型检查。cons...

  • C语言到C++(2) - const

    C++中最早引入const是为了替代#define,后来又衍生出了其它用法。这一篇中我们来详细介绍const的各种...

网友评论

    本文标题:C++思考笔记(2):用const替代#define,用cons

    本文链接:https://www.haomeiwen.com/subject/amsnmctx.html