当前位置: 首页 > news >正文

Effective C++读书笔记——item2(const,enum,inlines取代#define)

关于用常量取代 #define 的总体原则

在编程中,应尽量减少预处理器(特别是 #define)的使用,可通过合适的替代方式来避免 #define 带来的诸多问题,虽然不能完全消除预处理器相关指令(如 #include、#ifdef/#ifndef 仍有重要作用),但要让其使用频率降低。

简单常量方面

  1. 问题阐述
    使用 #define 定义常量存在诸多弊端,比如编译器在预处理阶段就将宏名称替换掉,使得该名称不会加入符号表,当出现常量使用错误时,错误信息中显示的是替换后的具体值,不利于查找错误源头,在符号调试器中也会因名字未加入符号表而出现类似问题。而且对于浮点常量,使用 #define 还可能导致目标代码中存在多个相同值的拷贝,增加代码量。
  2. 解决方法
    用 const 对象来取代 #define 定义的简单常量,例如const double AspectRatio = 1.653;,这样的常量能被编译器明确识别并加入符号表,对于浮点常量还能减少代码量。

特殊情况的常量定义

  1. 常量指针相关
    在头文件中定义常量指针(如基于 char * 的字符串常量)时,要注意将指针本身也声明为 const,像const char * const authorName = "Scott Meyers";。不过通常更推荐使用std::string类型来定义字符串常量,如const std::string authorName("Scott Meyers");
  2. 类属常量相关
    若要将常量作用范围限制在类内,需将其作为类的静态成员来声明,对于静态的整型族(如整数、字符、布尔型)类属常量,只要不获取其地址,可只声明不定义就能使用(如class GamePlayerstatic const int NumTurns = 5;声明后可直接在类内使用)。若需要获取地址或者编译器要求必须定义,则要在实现文件中给出定义(如const int GamePlayer::NumTurns;)。对于较老编译器不支持类内初始化语法的情况,可将初始值放在定义处。另外,还有 “the enum hack” 这种替代方法(如class GamePlayerenum { NumTurns = 5 };),它有类似 #define 不能取地址的特点,且在模板元编程等场景有应用,还不会导致不必要的内存分配,很多代码中会使用到这种方式。

类似函数的宏方面

  1. 问题阐述
    使用 #define 定义类似函数的宏(如#define CALL_WITH_MAX(a, b) f((a) > (b)? (a) : (b)))存在很多缺点,比如需要给宏体中的参数都加上括号来避免在表达式中调用时出现意外情况,但即便如此,仍可能出现参数解析次数等不可预测的问题,像宏调用时参数递增次数会因比较对象不同而变化。
  2. 解决方法
    使用内联函数模板来替代类似函数的宏,例如定义template<typename T> inline void callWithMax(const T& a, const T& b),它能获得宏的效率,同时具备完全可预测的行为以及常规函数的类型安全,还遵循函数的作用范围和访问规则。

总之,对于简单常量,用 const 对象或 enums 取代 #define;对于类似函数的宏,用内联函数取代 #define,以此提升代码的质量和可维护性等方面表现。

相关文章:

Effective C++读书笔记——item2(const,enum,inlines取代#define)

关于用常量取代 #define 的总体原则 在编程中&#xff0c;应尽量减少预处理器&#xff08;特别是 #define&#xff09;的使用&#xff0c;可通过合适的替代方式来避免 #define 带来的诸多问题&#xff0c;虽然不能完全消除预处理器相关指令&#xff08;如 #include、#ifdef/#i…...

如何科学评估与选择新版本 Python 编程语言和工具

文章目录 摘要引言评估新版本的关键因素适用性评估成本与收益分析 新版本功能的实际应用示例代码模块详细解析示例代码模块代码模块解析实际应用场景如何运行与配图 QA环节总结参考资料 摘要 随着技术的快速发展&#xff0c;编程语言和软件工具不断推出新版本&#xff0c;带来…...

第十届“挑战杯”大学生课外学术科技作品竞赛解析及资料

“挑战杯”被誉为大学生科技创新创业的“奥林匹克”盛会&#xff0c;它汇聚了来自各个学科、各个年级的精英人才。在这里&#xff0c;同学们带着对未知的好奇和对知识的渴望&#xff0c;组成一个个团队&#xff0c;向难题发起挑战。现在&#xff0c;第十届“挑战杯”大学生课外…...

【门铃工作原理】2021-12-25

缘由关于#门铃工作原理#的问题&#xff0c;如何解决&#xff1f;-嵌入式-CSDN问答 4 RST&#xff08;复位&#xff09;当此引脚接高电平时定时器工作&#xff0c;当此引脚接地时芯片复位&#xff0c;输出低电平。 按钮按下给电容器充电并相当与短路了R1改变了频率&#xff0c;按…...

Chain of Agents(COA):大型语言模型在长文本任务中的协作新范式

随着人工智能技术的飞速发展&#xff0c;大型语言模型&#xff08;LLM&#xff09;在自然语言处理领域的应用日益广泛。然而&#xff0c;LLM在处理长文本任务时仍面临诸多挑战。传统的解决方案&#xff0c;如截断输入上下文或使用基于检索增强生成&#xff08;RAG&#xff09;的…...

业务模型与UI设计

业务数据模型的设计、UI设计这应该是程序设计中不可缺少的部分。做程序设计的前提应该先把这两块设计好&#xff0c;那么&#xff0c;来一个实际案例&#xff0c;看看这2块的内容。 汽车保养记录业务模型与UI设计&#xff1a; 一、【车辆清单】 记录车辆相关的数据&#xff0…...

Apache SeaTunnel深度优化:CSV字段分割能力的增强

Apache SeaTunnel深度优化&#xff1a;CSV字段分割能力的增强 一、Apache SeaTunnel与CSV处理 1.1 Apache SeaTunnel简介 Apache SeaTunnel&#xff08;原名Waterdrop&#xff09;是一个分布式、高性能的数据集成平台&#xff0c;支持海量数据的实时同步。它允许用户通过配置…...

免费下载 | 2024年具身大模型关键技术与应用报告

这份报告的核心内容涉及具身智能的关键技术与应用&#xff0c;主要包括以下几个方面&#xff1a; 具身智能的定义与重要性&#xff1a; 具身智能是基于物理身体进行感知和行动的智能系统&#xff0c;通过与环境的交互获取信息、理解问题、做出决策并实现行动&#xff0c;产生智…...

SSM-Spring-AOP

目录 1 AOP实现步骤&#xff08;以前打印当前系统的时间为例&#xff09; 2 AOP工作流程 3 AOP核心概念 4 AOP配置管理 4-1 AOP切入点表达式 4-1-1 语法格式 4-1-2 通配符 4-2 AOP通知类型 五种通知类型 AOP通知获取数据 获取参数 获取返回值 获取异常 总结 5 …...

jenkins修改端口以及开机自启

修改Jenkins端口 方式一&#xff1a;通过配置文件修改&#xff08;以CentOS为例&#xff09; 找到配置文件&#xff1a;在CentOS系统中&#xff0c;通常可以在/etc/sysconfig/jenkins文件中修改Jenkins的配置。如果没有这个文件&#xff0c;也可以查看/etc/default/jenkins&…...

按照人们阅读Excel习惯来格式化BigDecimal

1、环境/问题描述 使用springboot发送邮件(附件)的方式将月度报表发送给领导查阅&#xff0c;数据是准确的&#xff0c;领导基本满意。 就是对一些数字的格式化提出了改进建议&#xff0c;比如不要让大数字自动转为科学计数法、浮点数小数点后都是0就不要带出来&#xff0c;根…...

IDEA开发Java应用的初始化设置

一、插件安装 如下图所示&#xff1a; 1、Alibaba Java Coding Guidelines 2.1.1 阿里开发者规范&#xff0c;可以帮忙本地自动扫描出不符合开发者规范的代码&#xff0c;甚至是代码漏洞提示。 右击项目&#xff0c;选择《编码规约扫描》&#xff0c;可以进行本地代码规范扫…...

Java网络套接字

在Java的开发中&#xff0c;有一个很重要&#xff01;很重要&#xff01;很重要&#xff01;的东西&#xff0c;叫做网络套接字&#xff0c;它被广泛的用来二次开发服务&#xff0c;比如大数据中台的服务链路调用等。 它的实现原理是依靠三次握手来完成通信的建立&#xff0c;…...

2025差旅平台推荐:一体化降本30%

医药行业因其高度专业化的特点&#xff0c;同时在运营过程中又极为依赖供应链和销售网络&#xff0c;因此差旅管理往往成为成本控制的重要环节。本期&#xff0c;我们以差旅平台分贝通签约伙伴——某知名药企为例&#xff0c;探讨企业如何通过差旅一体化管理&#xff0c;在全流…...

多个DataV遍历生成

DataV是数据可视化工具 与Echart类似 相对Echart图标边框 装饰可选官网DataV 安装 npm install kjgl77/datav-vue3main.ts import DataVVue3 from kjgl77/datav-vue3 app.use(DataVVue3)多个DataV遍历生成 Vue3viteDataV为例:<template><div w50rem h25rem flex&qu…...

mysql_real_connect的概念和使用案例

mysql_real_connect 是 MySQL C API 中的一个函数&#xff0c;用于建立一个到 MySQL 数据库服务器的连接。这个函数尝试建立一个连接&#xff0c;并根据提供的参数进行连接设置。 概念 以下是 mysql_real_connect 函数的基本概念&#xff1a; 函数原型&#xff1a;MYSQL *my…...

Python性能分析深度解析:从`cProfile`到`line_profiler`的优化之路

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 在软件开发过程中,性能优化是提升应用质量和用户体验的关键环节。Python作为广泛应用的高级编程语言,其性能分析工具为开发者提供了强大的…...

Momentum Contrast for Unsupervised Visual Representation Learning论文笔记

文章目录 论文地址动量队列对比学习的infoNCE loss为什么需要动量编码器对比学习moco方法中的动量Encoder为什么不能与梯度Encoder完全相同为什么动量编码器和梯度编码器不能完全相同&#xff1f;总结&#xff1a; 我理解&#xff0c;正负样本应该经过同一个encoder&#xff0c…...

用户界面的UML建模07

4.2 抽象表示层的行为&#xff08;Abstract Presentation Behaviour&#xff09; AbstractForm 类定义了一组如下所示的四种操作&#xff1a; showForm() &#xff0c; getData() &#xff0c; sendConfirmation() 和sendCancellation()。在该阶段的设计过程&#xff08;desig…...

Node.js中使用Joi 和 express-joi-validation进行数据验证和校验

在进行项目开发的过程中&#xff0c;很多时候系统对用户输入的数据会进行严格校验的&#xff0c;通常我们会以“前端校验为辅&#xff0c;后端校验为主”的思想进行校验处理。 后端接口校验的时候&#xff0c;是只能一直使用if进行逻辑判断呢&#xff0c;还是有更加方便的方法…...

生成xcframework

打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式&#xff0c;可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

对WWDC 2025 Keynote 内容的预测

借助我们以往对苹果公司发展路径的深入研究经验&#xff0c;以及大语言模型的分析能力&#xff0c;我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际&#xff0c;我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测&#xff0c;聊作存档。等到明…...

C++八股 —— 单例模式

文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全&#xff08;Thread Safety&#xff09; 线程安全是指在多线程环境下&#xff0c;某个函数、类或代码片段能够被多个线程同时调用时&#xff0c;仍能保证数据的一致性和逻辑的正确性&#xf…...

Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档&#xff09;&#xff0c;如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下&#xff0c;风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...

【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)

前言&#xff1a; 双亲委派机制对于面试这块来说非常重要&#xff0c;在实际开发中也是经常遇见需要打破双亲委派的需求&#xff0c;今天我们一起来探索一下什么是双亲委派机制&#xff0c;在此之前我们先介绍一下类的加载器。 目录 ​编辑 前言&#xff1a; 类加载器 1. …...

使用SSE解决获取状态不一致问题

使用SSE解决获取状态不一致问题 1. 问题描述2. SSE介绍2.1 SSE 的工作原理2.2 SSE 的事件格式规范2.3 SSE与其他技术对比2.4 SSE 的优缺点 3. 实战代码 1. 问题描述 目前做的一个功能是上传多个文件&#xff0c;这个上传文件是整体功能的一部分&#xff0c;文件在上传的过程中…...

DAY 26 函数专题1

函数定义与参数知识点回顾&#xff1a;1. 函数的定义2. 变量作用域&#xff1a;局部变量和全局变量3. 函数的参数类型&#xff1a;位置参数、默认参数、不定参数4. 传递参数的手段&#xff1a;关键词参数5 题目1&#xff1a;计算圆的面积 任务&#xff1a; 编写一…...

uni-app学习笔记三十五--扩展组件的安装和使用

由于内置组件不能满足日常开发需要&#xff0c;uniapp官方也提供了众多的扩展组件供我们使用。由于不是内置组件&#xff0c;需要安装才能使用。 一、安装扩展插件 安装方法&#xff1a; 1.访问uniapp官方文档组件部分&#xff1a;组件使用的入门教程 | uni-app官网 点击左侧…...

数据库——redis

一、Redis 介绍 1. 概述 Redis&#xff08;Remote Dictionary Server&#xff09;是一个开源的、高性能的内存键值数据库系统&#xff0c;具有以下核心特点&#xff1a; 内存存储架构&#xff1a;数据主要存储在内存中&#xff0c;提供微秒级的读写响应 多数据结构支持&…...

无需布线的革命:电力载波技术赋能楼宇自控系统-亚川科技

无需布线的革命&#xff1a;电力载波技术赋能楼宇自控系统 在楼宇自动化领域&#xff0c;传统控制系统依赖复杂的专用通信线路&#xff0c;不仅施工成本高昂&#xff0c;后期维护和扩展也极为不便。电力载波技术&#xff08;PLC&#xff09;的突破性应用&#xff0c;彻底改变了…...