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

宏定义(#define) #include"stdio.h" //带参宏的定义 //#define 标识符(形参表) 形参表达式 #define MAX(a,b) ((a)>(b))?(a):(b) //可以像函数一样使用 通过实参和形参传递数据 //+运算符的优先级高于比较运算符 所以(a)>(b)这个小括号可以不加 #define F(a) a*a #define SUM(x) (x+SUM(x)) //函数和宏的区别: //函数和宏是完全不一样的 函数要求实参与形参类型一致 而宏替换不需要 函数只有一个返回值 而 阅读详情

Core List :

1. const 和 #define

(1) 语法

    #define sum 100 【define详细用法见附1】

    const int sum = 100;

    const char* const name = "Boxi";

    const std::string name("Boxi");【定义常量字符串时,使用string优于const char*】

注:

    a. 定义常量指针(指针 + 指针所指向之物均为const,即需要两个const)

        const int * const sum = 0;

        【第一个const】 :sum 指向一个const int 类型

        【第二个const】 :sum 是一个常量指针,即所指向的地址不变

    b. class专属常量

        确保常量的作用于限制于class内 =>  class的成员

        确保常量至多一份实体 => static修饰

        例:

        const int Record::sum = 3; // 变量sum的定义式(放在实现文件而非头文件)

        class Record {

        private:

                  static const int sum;  //变量sum的声明式而非定义式 

        } //类的定义放在头文件 

        注:“部分编译器”不支持“in-class初值设定”,如上需要在sum定义时赋值初值,但存在一种情况,数组长度问题,可使用下面方法解决。

        class Record {

        private:

        enum { sum = 4 }; //enum 类似 define 而非 const (取const 地址合法, 取enum 和 define 地址是不合法的)

        int array[sum];

}

(2) 区别

    define 预处理时进行替换,对编译器不可见,无法限制作用

    const 编译器进行处理,可以提供封装性


2. inline 和 #define

(1) 语法

    #define MAX(a,b)  f((a)>(b)?(a):(b))

    template<typename T>

    inline void max(const T&a, const T &b)

    { f(a > b ? a : b) }

(2) 区别

    define 宏定义函数,预处理直接替换,容易产生歧义,但不同于函数调用,不会产生开销

   

附1: #define详细用法

1. 定义“常量”

#define sum 100

2. 定义“函数”

 #define MAX(a,b)  f((a)>(b)?(a):(b))

3. 定义多行代码

do {/

int a;/

} while(0)/

每行结束需要添加 “/”


注:

1. # 表示预处理命令

2. 不需要加末尾分号,否则连带分号一起替换

3. 生效期:从宏定义开始到文件结尾,可以使用#undef sum 来提前结束宏定义作用域


Health & Beauty

Health :  阿胶,艾灸

Beauty : 面膜,娇韵诗,精油

Weight : 46.9kg

Sport : 瑜伽球,半仰


条款02:尽量以 const, enum, inline替换 #define 文章摘要:本文建议优先使用const、enum和inline替代#define宏定义。const常量具有类型安全、调试友好和优化空间等优势;enum hack适用于类专属编译期常量;inline函数可避免宏函数的参数求值和优先级问题。虽然预处理器在条件编译中仍有作用,但应尽量减少对#define的依赖,转而使用更安全的现代C++特性如constexpr和模板。核心原则是让编译器而非预处理器处理更多工作,以提高代码的可靠性和可维护性。 阅读详情

相关推荐

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

文章目录条款 02:尽量以 const, enum, inline 替换 #define问题产生解决方法替换#defines的两种特殊情况1. 定义常量指针 (constantpointers)2. 定义class专属常量认识enum的理由行为实用 条款 02:尽量以 const, enum, inline 替换 #define 这个条款或许改为“宁可以编译器替换预处理器”比较好,因为或许#define 不被视为语言的一部分。那正是它的问题所在。 问题产生 例如下面代码: #define ASPECT_RA

流楚丶格念的博客 2314

Effective C++ 读书笔记 —— 条款2:尽量以const,enum,inline替换#define

Core List : 1. const 和 #define (1)语法 #define sum 100

226

《Effective C++》 读书笔记(详细总结55条款)上篇

下面从四个方面来说 (1) C++ 以 C 为基础,很多语句语法都没有改变,只是进行了扩展,C++ 解决问题的时候,可以理解为 C 的高效解法 (2) 面向对象,有构造函数,析构函数,继承、封装、多态、虚函数动态绑定,这是不同于C 语言的部分 (3) 泛型编程、可以理解为代码的模型,但是代码本身并不占用内存空间,只有在实例化的时候,才分配内存,所以可以提高代码复用性

身在边城 心在编程 2499

C语言知识__宏

宏的定义 #define  标识符替换列表 例如  #define  Sum 100     Sum的值为100 带参数的宏  #define指令-带参数的宏 例如 #define Max(a,b)  ((a>b)?(a):(b))    这个宏的作用是用来找最大值的 注:带参数的宏经常当作一些简单函数来使用。 优点: ①程序可能会稍微快些。一个函数调用在执

u010187864的博客 329

【浙大翁恺】C语言习题

/* 02-0. 整数四则运算(10) 本题要求编写程序,计算2个正整数的和、差、积、商并输出。 题目保证输入和输出全部整型范围内。 输入格式: 输入在一行中给出2个正整数A和B。 输出格式: 在4行中按照格式“A 运算符 B = 结果”顺序输出和、差、积、商。 输入样例: 3 2 输出样例: 3 + 2 = 5 3 - 2 = 1 3 * 2 = 6 3 / 2 =.

qq_43600867的博客 5854

ESP32-CAM图传小车:端边协同的嵌入式视觉系统设计

在物联网边缘智能场景中,嵌入式视觉系统需平衡实时性、算力与成本。其核心在于理解图像采集、硬件编码、低延迟传输与分层计算的基本原理——OV2640等CMOS传感器配合JPEG硬件编码可显著降低主控负载;TCP流式协议比HTTP/RTSP更适配资源受限MCU;而‘计算卸载’架构将OpenCV等重负载移至Android端,使ESP32专注实时控制与传输,既发挥FreeRTOS任务调度优势,又规避了PSRAM带宽与内存瓶颈。该模式广泛适用于教育机器人、智能巡检及DIY视觉终端等场景,本文以WiFi图传坦克小车为载体

weixin_42524864的博客 373

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

Effective C++在此条款中总结出两个结论    1.对于单纯常量,最好以const对象或enum替换#define    2.对于形似函数的宏,最好改用inline函数替换#define接下来我们进行详细的探讨。const替换#define的讨论    例如:#define ASPECT_RATIO 1.653    原书给出的解释大意是:        你所使用的名称(ASPECT_R...

Galaxy_saltyfish的博客 301

codemirror6 制作markdown编辑器(源码模式)

总体上感觉能用,但是不怎么友好,官方文档有点散乱,而且关键字高亮功能是独立出去的,去官方文档找半天,也没找到怎么改。EditorView.theme可以往EditorView模块中修改CSS的样式,从而影响编辑器的样式展示。"### 测试\n\n```javascript\nlet x = 'y'\n```"这个插件中的markdown语法的高亮样式。//这里指定markdown中代码块使用的解析扩展。开头的class样式,并且还需要在选择器前面添加。//markdown语言解析扩展。

qq_43203949的博客 1783

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

这个条款或许可以改为“宁可以编译器替换预处理器”。 如果你做出这样的事: #define ASPECT_PATIO 1.653 记号名称 ASPECT_PATIO 从未被编译器看见;也许在编译器开始处理源代码之前它就被预处理器移走了。于是记号名称 ASPECT_PATIO 有可能没有进入符号表(symbol table)内。于是,当你运用此常量但获得一个编译错误信息时,可能会带来困惑。因

赚钱去看球 514

网格自适应实战 | 攻克超弹性体大变形不收敛难题

本文针对超弹性体(如橡胶)在大变形仿真中因网格严重扭曲导致计算不收敛的难题,提供了基于ANSYS网格自适应技术的实战解决方案。文章详细阐述了从问题诊断、模型准备到核心参数设置的完整流程,并介绍了结合混合U-P单元技术的进阶组合策略,有效攻克了材料压缩等场景下的仿真收敛问题。

week9的博客 518

基于 SquashFS 构建 Linux 可读写文件系统

嵌入式 Linux 启动过程 本文所描述的的 Linux Image 由 BootLoader、kernel、initrd、rootfs 组成,它们共同存在于一个可以启动的存储设备中(本文以 USB 为例)。组成架构如下: 图 1. 可启动 linux 镜像文件结构 各个模块的作用如下: Boot Loader:由 BIOS 加载,用于将后续的 Kernel 和 initrd 的装载到内存中 kernel:为 initrd 运行提供基础的运行环境 initrd:检测并加载各种驱动程序 ro

wzq2009的专栏 1174

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

#define ASPECT_RATIO 1.653 基础知识: (1)宏定义#define NAME Value 是预处理器处理,编译器无法看到NAME,没有进入记号表(symbol table)中。 存在问题: (1)当运用该常量获得一个编译错误信息时,由于ASPECT_RATIO不在symbol table中,那么编译错误提示1.653而不是ASPECT_RA...

fm2011的专栏 301

发那科机器人通信库使用指南与踩坑记录

GitHubNuGet(如本文基于该库,在 C# / .NET 下通过 TCP 与 FANUC 机器人控制器通信,实现读当前位姿、PR 寄存器、以及 DI/DO/GI/GO 等 IO 的读写。GitHubNuGet(如本文基于该库,在 C# / .NET 下通过 TCP 与 FANUC 机器人控制器通信,实现读当前位姿、PR 寄存器、以及 DI/DO/GI/GO 等 IO 的读写。

songhuangong123的博客 323

Effective C++读书笔记(条款02:尽量以const,enum,inline替换#define)

这个条款可以理解成“宁可以编译器替换预处理器”。 使用常量可能比使用#define导致较小量的码,因为预处理器“盲目地将宏名称替换”可能导致目标码出现多份。

zhongh58的博客 643

虚拟化 之三 详解 ARM 平台 jailhouse 的移植适配、构建及使用(飞腾派)

本文将探索学习通过在飞腾官方提供的 Buildroot 构建系统移植适配 openEuler 内核以及 jailhouse 源码 Package 进而直接构建一个适用于飞腾派开发板的带有 jailhouse 的 openEuler 发行版。

技术干货 1004

SMPLify-x-master | 复现记录

由于毕业设计中将会用到smpl模型,而smplify方法的各环境依赖版本比较老,复现不太容易,因此便进行了smplifyx方法使用smplx的方法。由于在过程中遇到较多坑,因此进行记录和分享。

qq_44916003的博客 5100

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

#define是由预编译器处理。 我们无法利用#define创建一个class专属常量,因为#define并不重视作用域。一旦宏被定义,它就在其后的编译过程中由效(除非在某处被#undef)。这意味#define不仅不能够用来定义class专属常量,也不能够提供任何封装性,也就是说没有所谓private #define这样的东西。而当然const成员变量是可以被封装的。

Do-Program的专栏 277

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

[Effective C++读书笔记]002_条款02_尽量以const,enum,inline替换#define

作者在本节提醒读者注意两点: 1. 对于单纯的常量,最好以const对象或enum替换#define 2. 对于形就似函数的宏定义,最好改用inline函数替换#define 1. 对于单纯的常量,最好以const对象或enum替换#define 在阅读这一条的时候,我们要知道为什么要用const对象或enum来替换#define,要知道#define定义的常量的缺陷。首先,...

weixin_33747129的博客 127

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

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

摘要 这一节按照顺序说了以下这么5件事情: 上来首先强调一个观念,尽量用const常量来替换#define定义,原因有两个,1) const常量名会进入记号表方便调试;2)#define会导致目标码出现多份对象;第1条引申出两个特殊情况分别列出在第2和第3; 但是第1条所说的const常量有两个特殊情况,这里第一个特殊情况是定义常量指针,因为常量定义式通常放在头文件,因此头文件内的常量指针必...

liangll的博客 296

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

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

使用宏定义是一个不被推荐的做法,在阅读了书籍并且结合自身所读过的博客,总结以下两点不推荐使用宏定义的理由。 --1、宏定义是简单的字符串替换: 由于宏定义只是进行简单的字符串替换,因此有可能会造成意想不到的情况。典型的一个例子就是#define x+x 2x,当我们使用2x*2x时,我们的意图是得到(x+x)*(x+x),即4x,但实际上由于字符串替换 2x*2x相当于x+x*x+x=x+x^

WingC的博客 350

《Effective C++》学习笔记(条款02:尽量以 const、enum、inline 替换 define)

最近开始看《Effective C++》,为了方便以后回顾,特意做了笔记。若本人对书中的知识点理解有误的话,望请指正!!! 例如: #define A 1.653 /*宏常量的名称 'A' 在编译器中是看不见的,编译器看到的是 1.653。 当你使用这个宏常量时但获得了一个编译错误信息时,错误信息 中提到的是 '1.653' 而不是 'A'。若宏常量不是你所写的,那么 调试的时候会很麻烦*/ //解决方法:定义全局常量 const double A = 1.653; 当我们以常量替换#define,有两

ZLX的博客 355

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

Effective C++条款02:尽量以const,enum,inline替换#define(Prefer consts,enums and inlines to #defines)

CltCj的博客 918

Effective C++ 条款27: 尽量用const、enum、inline替换 #define

Effective_C++_27

君鼎的博客 968
上一篇: Effective C++ 读书笔记 —— 条款2:尽量以const,enum,inline替换#define
下一篇: Effective C++ 读书笔记 条款03:尽可能使用const
B_Dogs881221
博客等级 码龄15年 15粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值