替换define,也就是“以编译器替换预处理器”。#define是C语言里的利器,但在C++里有很多取代它的理由。

  • define是预处理的一部分,而不是编译器的一部分,它在编译前就被替换掉,因此不会保留符号信息。

    #define ASPECT_RATIO 1.653
    //const double ASPECT_RATIO = 1.653;

    假设后文里ASPECT_RATIO引发了错误,在某些情况下信息可能只会提到1.653而不是原名,这样一来追踪错误将变得困难得多,使用const就不会有问题。同时define只做字符串替换,但const不一定,他有可能将后文替换为1.653,也有可能保留这个量,以减小可执行文件大小。

  • define是预处理的一部分,所以没有作用域。这个显而易见,如果我想使用函数内或者类里专属的常量,const显然更适合,因为他有作用域的判定。如果使用define,那么还要在末尾undef一次。除此之外还有一种“enum hack”的做法:

    class A{
    enum {maxnum = 5};
    ...
    };

    这样,你可以使用maxnum充当常量,拥有作用域,同时和define一样不能被取地址。

  • 用inline替换函数则是大家比较熟悉的。用define写函数我们都知道要加满括号,但即使你加满括号,也会出现不同于真正函数调用的行为:

    #define CALL_WITH_MAX(a, b) f((a)>(b) ? (a):(b))
    CALL_WITH_MAX(a++, b);

    在这种情形下,a++竟然有可能被调用两次,这显然不对。这样类型的宏可以用模板配合inline很方便的达到相同的效果。

当然,这些知识只是为了让你认识到define在某些情况的局限性,也不是说真的就不该用。很多时候define又是很方便的。(就好比goto)

Effective C++:以const、enum和inline来替换define的更多相关文章

  1. effective c++ prefer const,enum, inline to #defines

    学习心得 对于纯常量,最好以const对象或者enums替换#define #define FIRST 3 //not good enum { first=1, second=2 } ; int nu ...

  2. 条款2:尽量以const enum inline 来替换 #define

    这里说的意思其实相当于,宁可以用编译器来替换预处理器 因为使用预处理器可能使得被处理过的东西无法进入符号表,例如 #define MAXLEN 16 这里的MAXLEN并没有进入符号表,这样有编译错误 ...

  3. 《Effective C++》读书笔记 条款02 尽量以const,enum,inline替换#define

    Effective C++在此条款中总结出两个结论 1.对于单纯常量,最好以const对象或enum替换#define 2.对于形似函数的宏,最好改用inline函数替换#define 接下来我们进行 ...

  4. Book. Effective C++ item2-尽量使用const, enum, inline替换#define

    ##常规变量 c++里面的#define后面的定义部分,是不算代码的一部分的.所以如果你使用#define: #define ASPECT_RATIO 1.653 你希望这个代号ASPECT RATI ...

  5. Effective C++阅读笔记_条款2:尽量以const,enum,inline替换#define

    1.#define缺点1 #define NUM 1.2 记号NUM可能没有进入记号表,在调试或者错误信息中,无法知道1.2的含义. 改善:通过const int NUM = 1.2; 2.#dein ...

  6. Effective C++ 条款02:尽量以const,enum,inline替换 #define

    换一种说法就是宁可以编译器替换预处理器 举例 #define ASPECT_RATIO 1.653 记号ASPECT_RATIO也许从未被编译器看见:也许在编译起开始处理源码前它就被预处理器移走了,于 ...

  7. 【Effective C++ 读书笔记】条款02: 尽量以 const, enum, inline 替换 #define

    条款02: 尽量以 const, enum, inline 替换 #define 这个条款或许可以改为“宁可以编译器替换预处理器”. 编译过程: .c文件--预处理-->.i文件--编译--&g ...

  8. Effective C++学习笔记 条款02:尽量以const,enum,inline替换 #define

    尽量使用const替换 #define定义常量的原因: #define 不被视为语言的一部分 宏定义的常量,预处理器只是盲目的将宏名称替换为其的常量值,导致目标码中出现多分对应的常量,而const定义 ...

  9. 尽量用const,enum,inline代替define

    在读<Effective C++>之前,我确实不知道const,enum,inline会和define扯上什么关系,看完感觉收获很大,记录之. define: 宏定义. 在编译预处理时,对 ...

  10. 条款2:尽量以const、enum、inline替换#define

    1> 以const替换#define • 比如用const double Ratio = 1.653替换#define RATIO 1.653 因为宏定义在预处理阶段就会被替换成其所指代的内容, ...

随机推荐

  1. ubuntu 服务器显示 计算显卡的剩余 显存空间 并执行计划任务

    在Ubuntu服务器上需要运行gpu计算任务,由于需要无人值守的在显存空间满足条件的时候运行程序,于是有了自动显示显存的程序及自动运行任务的程序: 自动显示显存: import os import r ...

  2. 如何拉取指定CPU架构并且指定ubuntu版本并且指定cuda和cudnn版本的docker镜像

    本篇讲的重点是如何拉取带有cuda和cudnn的docker镜像,因此这些的镜像源的频道为NVIDIA: 官方地址: https://hub.docker.com/r/nvidia/cuda 根据官方 ...

  3. 使用UltraISO克隆clone树莓派SD卡(注意不是复制、备份,是克隆)

    搞了好长时间做了一个树莓派的SD卡,包括了一些自己安装的配置,为了防止哪天把这个SD卡搞坏掉(比如写数据时候断电,比如apt upgrade时掉电),于是考虑把这个SD卡进行克隆clone. 因为手上 ...

  4. Google公司的python编码规范指南

    原文地址: https://google.github.io/styleguide/pyguide.html ============================================= ...

  5. Ubuntu22.04系统安装DeepMind Lab

    相关资料: DeepMind Lab的一些python例子-----(Ubuntu22.04系统安装DeepMind Lab)后续 ================================== ...

  6. maven项目打包时排除依赖包

    1.背景 为了快速上传jar包到服务器,很多时候我们需要把依赖包单独独立出来,避免每次修改都传依赖包 2.实现方式 maven的pom文件,没有独立依赖包时配置如下: <build> &l ...

  7. vue(element)中代码高亮插件全面对比

    @ 目录 全面对比 从活跃方面来看 从功能方面来看 深入对比 1,ace 2,codemirror 3,monaco 4,结论 全面对比 从活跃方面来看 从功能方面来看 代码高亮是必须的,社区必须活跃 ...

  8. WPF如何给window加阴影效果

    <Style x:Key="WindowStyle1" TargetType="{x:Type Window}"> <Setter Prope ...

  9. kubeadm升级k8s之1.23.17->1.24.17

    查看当前版本 [root@k8s-master31 ~]# kubectl get nodes -o wide NAME STATUS ROLES AGE VERSION INTERNAL-IP EX ...

  10. SparkStreaming本地化策略性能调优与使用场景分析

    1.背景介绍:平台使用的华为FI C203的版本,通过SparkStreaming消费kafka数据后,进行算法处理入库.其中在算法部分耗时为4秒,每个批的数据量在30MB左右.执行算法部分的算子分区 ...