Effective C++ 读书笔记 —— 条款2:尽量以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 来提前结束宏定义作用域

条款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

C语言知识__宏

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

u010187864的博客 329

item2:使用inline,enum,const替代#define

本文探讨了现代C++中替代传统宏定义的最佳实践。宏定义作为预处理指令存在类型安全缺失、作用域污染、调试困难等固有缺陷。作者建议:用const/constexpr替代值宏保证类型安全;用inline函数和模板替代函数式宏避免副作用;用enum和constexpr if实现编译期条件判断。这些方案充分利用编译器机制,将预处理操作迁移至编译阶段,通过类型检查和语义分析提升代码健壮性。尽管宏在条件编译等场景仍有价值,但现代C++特性已能覆盖绝大多数宏的使用场景,使代码更符合类型系统和编程范式。

2301_79843115的博客 875

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

中“宁可以编译器替换预处理”算是另一种提法,不过这个应该是概括性的说法吧 主要事项注意如下: 1用const double AspectRatio=1.653;代替#define ASPECT_RATIO  1.653   原因是预编译时define会被简单的替换,这样在编

xiexievv的专栏 932

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

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

身在边城 心在编程 2499

【Effective C++】条款2学习

《条款2:以const、enum、inline替换#define的实践指南》摘要 本文探讨了用编译器特性取代预处理宏的三个关键场景:1)用const/constexpr替换#define常量,避免符号丢失和调试困难;2)用inline函数替代宏函数,消除参数多次求值风险;3)类内常量的两种实现方案:static const整型(C++11可用constexpr)或枚举。特别强调了静态成员的初始化规则:非整型const static需类外定义,而constexpr static成员(含非整型)可在类内初始化。

weixin_45414088的博客 974

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

这是我在学习《Effective C++》时, 依据自己的理解记录的笔记. 仅仅是个人理解, 看到这个博客的读者, 如果发现其中存在的问题, 希望可以指出. 我当尽快修改纠正.标签: c++, effective c++, 读书笔记。

qq_38193114的博客 277

信号与系统——卷积、相关运算与FFT关系以及工程应用(三)

卷积运算、相关运算

qq_35028634的博客 6612

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

Effective_C++_27

君鼎的博客 968

基于STM32的工业I/O模块硬件电路实现

深入解析基于STM32的工业I/O模块硬件电路实现,涵盖关键电路设计与信号处理,突出硬件电路稳定性和工业级可靠性,适合嵌入式开发者参考。

weixin_35835018的博客 453

Lumerical官方案例、FDTD时域有限差分法仿真学习(十八)——Y分支粒子群算法优化

组件优化是任何致力于开发高性能光子器件的设计过程的关键步骤。 此绝缘体上硅 Y 分支示例演示了适用于任意优化例程的通用组件形状参数化方法。 此示例中的算法是 Lumerical 的内置粒子群优化 (PSO),可通过用户界面轻松设置。 此外,建议的优化过程展示了如何将 varFDTD 与全 3D FDTD 求解器相结合,以显着减少优化时间,同时保持高精度。

weixin_45719141的博客 1万+

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

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

CltCj的博客 918

在Modelsim中手动添加仿真库

缘由:在使用rom ip核的时候发现仿真需要altera_mf库的支持,而我的ModelSim没有这个库,所以想写一篇手动添加仿真库的文章方便自己以后使用:首先新建一个库,名字叫做altera_mf:然后编译对应的库文件:这里altera_mf.v文件是在quartus安装路径下quartus\eda\sim_lib文件夹下,点击编译后退出:最后在modelsim->example文件夹下可以找到编译好的库文件:

欢迎一起交流问题! 3402

《Effective C++》精读总结 — 2. 尽量以const,enum,inline替换#define

文中说这个条款也可以改成“尽量以编译器替换预处理器”,个人觉得这句话主要是说编译器是方便对代码本身进行调试的,但是预处理器其实和代码的逻辑无关,如果程序报错是很难排查的。所以尽量减少在预处理阶段的操作。宏定义常量可以替换为const常量,这样做即能够统一管理,还增加了类型检查等宏定义无法实现的优点。最后,#define的需求降低了,但是#include和#ifdef/#ifndef仍然很重要,所以预处理器的工作不能完全替代。

见牛羊的博客 814

基于STM32的频率计(采用外部中断的方式)

前言 最近在了解电赛相关的东西,和指导老师交流一下,我决定先从最简单的频率计做起。 频率计是来检测信号的频率的,在做频率计的时候可以用信号发生器发出的信号来进行测试。 原理 这是最基础的方波,我们可以通过检测上升沿的方式来测量其频率。从周期的角度出发连续两个上升沿的时间就是这个方波的周期,那这个周期分之一就是这个方波的频率了。 在思考了一段时间~~(我是萌新。。)~~ 我觉得有两个方法可以实现,第一个是采用stm32定时器的输入捕获功能,第二个就是用外部中断来实现这个功能。正如标题,我这次采用外部中断的方

qq_45784922的博客 6171

Agv、Rgv 车辆控制调度系统开发第一篇

Agv、Rgv 车辆控制调度系统第一篇为什么要做这个系统先看作品从头讲起算法讲解编程语言从哪里开始继续深入预告 为什么要做这个系统 说白了是为了赚钱,在一个项目中发现公司买别人家的调度系统要几十万,还只是一个项目的实施,从那天起我就决定自己写一套,用了一年的时间写出来后,才发现根本卖不掉,卖不掉就卖不掉吧,反正我现在已经吧写这套系统当成了一种乐趣,如果不让我写了我反而不适应,但是没有人欣赏我的成果我反而很难受,所以决定吧这个系统的创作过程,写下来,给后面的人一些建议,少走点弯路。 先看作品 从头讲起 在

持续分享调度系统开发过程 2万+

重读经典-《Effective C++》Item2:尽量以const,enum,inline替换#define

○ 静态常量数据成员可以在类内初始化(即类内声明的同时初始化),也可以在类外,即类的实现文件中初始化,不能在构造函数中初始化,也不能在构造函数的初始化列表中初始化; ○ 静态非常量数据成员只能在类外,即类的实现文件中初始化,也不能在构造函数中初始化,不能在构造函数的初始化列表中初始化; ○ 非静态的常量数据成员不能在类内初始化,也不能在构造函数中初始化,而只能且必须在构造函数的初始化列表中初始化; ○ 非静态的非常量数据成员不能在类内初始化,可以在构造函数中初始化,也可以在构造函数的初始化列表

学习,思考,记录,分享。 4283

MimicKit 人形机器人强化学习全身模仿控制算法使用教程

本文介绍了MimicKit运动模仿算法框架的使用指南。主要内容包括:1)安装IsaacGym和依赖项;2)训练模型命令及参数说明;3)测试模型的方法;4)分布式训练配置;5)使用TensorBoard可视化日志;6)动作数据格式说明。该框架支持DeepMimic、AMP、ASE、ADD等算法,包含PPO、AWR等强化学习算法,适用于物理仿真角色动画控制研究。

机器人控制与仿真应用 1201

Effective-C++阅读解析条款(条款二:尽量以const,enum,inline替换#define)

Effective C++条款二(尽量以const,enum,inline替换#define)理解

m0_74824254的博客 993

超临界二氧化碳再热再压缩布雷顿循环建模与先进控制

超临界二氧化碳布雷顿循环建模与先进控制研究 本文研究了超临界二氧化碳再热再压缩布雷顿循环系统的建模与控制。通过MATLAB/Simscape构建了包含压缩机、透平、回热器等关键组件的动态模型,并设计了基于模型预测控制(MPC)和自抗扰控制(ADRC)的多层控制策略。系统采用转速控制的压缩机、阀门开度控制的透平,以及可变热源加热器,实现了全动态分析。研究结果表明,MPC与ADRC混合控制方案相较于传统PID控制,功率超调降低至0.9%,效率波动控制在±0.08%,扰动恢复时间缩短至12秒。

AI的内部世界的博客 340

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

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

声明: 文中内容收集整理自《Effective C++(中文版)第三版》,版权归原书所有。 本内容在作者现有能力的基础上有所删减,另加入部分作者自己的理解,有纰漏之处敬请指正。 条款02:尽量以const,enum,inline替换#define Prefer const, enums, and inlines to #includes. 这个条款或许改为“宁可以编译器替换预处理器”比较好...

HakunaMatata的博客 238

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Effective C++ 条款2 尽量用const, enum, inline替换#define

众所周知:代码编译为四个步骤:预编译-->编译--->汇编--->链接 而#define是预编译过程处理的东西,而const,enum,inline是编译过程处理的东西。尽量用const, enum, inline替换#define这句话也可以说:编译优于预编译。 #define Global_Var_AA 10.662 int Global_Var_BB = 10; 比如定义如上两个变量,通过 g++ -g main.cpp readelf a.out -a > a.

zion--6135的博客 588

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Effective C++条款02:让自己习惯C++之(尽量以const,enum,inline替换#define)

一、为什么不推荐使用#define 在程序中你可能会定义下面一个宏,来表示一个数值 #define ASOECT_RATIO 1.653 #define的缺点 ①宏的名称是不会被编译器看见的,因为在程序的预处理阶段,宏会被替换为其对应的数值/表达式,因此宏对于编译器来说是不存在“名称”这一概念的。 ②因为宏没有名称这一概念,因此宏的名称是不会进入符号表中(symbol table),宏...

董哥的黑板报 1247

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

一起读《Effective C++》: 条款02:尽量以const, enum, inline替换 #define 文章目录一起读《Effective C++》: 条款02:尽量以const, enum, inline替换 #define条款02:尽量以const, enum, inline替换 #define一起读知识点补充知识点一:C++程序的编译过程知识点二:记号表 / 符号表(symbol table) 条款02:尽量以const, enum, inline替换 #define Prefer

阴无月的博客 414

Effective C++之以const 、enum、iniline替换#define

本文总结自<<Effective C++, 改善程序设计的55个条款>>中的条款3 : “尽量以const, enum, inline 替换#define”(宁可以编译器替代预处理器). 同时辅以<<深入理解计算机系统>>中的第五章“优化程序性能”中的一些内容. 一、用const替换#define #define RAD_2_DEGREE 180.0/M_PI 宏定义之所以不被推荐使用是因为它在预处理阶段被替换了, 也就是说...

遥远的她 1121
上一篇: Linux 下svn恢复到某一版本
下一篇: Effective C++ 读书笔记——条款02:尽量以const,enum,inline替换#define
B_Dogs881221
博客等级 码龄15年 15粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值