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

【Effecutive C++】条款02 尽量以const, enum, inline替换 #define

Prefer consts, enums, and inline to #define.

这个条款或许改为“宁可以编译器替换预处理器”比较好,因为或许#define不被视为语言的一部分。那正是它的问题所在。当你做出这样的事情:

#define ASPECT_RATIO 1.653

记号名称ASPECT_RATIO也许从未被编译器看见:也许在编译器开始处理源码之前它就被处理器移走了。于是记号名称ASPECT_RATIO有可能没进入记号表(symbol table)内。于是当你运用此常量但获得一个编译错误信息时,可能会带来困惑,因为这个错误信息也许会提到1.653而不是ASPECT_RATIO。如果ASPECT_RATIO被定义在一个非你所写的头文件内,你肯定对1.653以及它来自何处毫无概念,于是你将因为追踪它而浪费时间。这个问题也可能出现在记号式调试器(symbolic debugger)中,原因相同:你所使用的名称可能并未进入记号表(symbol table)。

解决之道是以一个常量替换上述的宏(#define):

const double AspectRatio = 1.653;   //大写名称通常用于宏,因此这里改变名称写法。

作为一个语言常量,AspectRatio肯定会被编译器看到,当然就会进入记号表内。此外对浮点常量(floating point constant,就像本例)而言,使用常量可能比使用#define导致较小量的码,因为预处理器“盲目地将宏名称ASPECT_RATIO替换为1.653”可能导致目标码(object code)出现多份1.653,若改用常量AspectRatio绝不会出现相同情况。

http://www.lryc.cn/news/416286.html

相关文章:

  • leetcode-226. 翻转二叉树
  • 用的到linux-tomcat端口占用排查-Day5
  • mqtt协议详解(0)初步认识mqtt
  • Java语言程序设计基础篇_编程练习题*16.7 (设置时钟的时间)
  • YOLOv8新版本支持实时检测Transformer(RT-DETR)、SAM分割一切
  • 【传输层协议】UDP和TCP协议
  • Java Excel复杂表头,表头合并单元格
  • Java整合腾讯云发送短信实战Demo
  • 电路中电阻,电容和电感作用总结
  • OrangePi AIpro学习1 —— 烧写和ssh系统
  • Gather 全球化进程迅速 多重利好推动未来发展
  • 面试经典 222. 完全二叉树的节点个数
  • 【css】3d柱状图-vue组件版
  • 《计算机组成原理》(第3版)第3章 系统总线 复习笔记
  • 【网络安全】https协议的加密方案避免中间人攻击(MITM攻击)导致的数据泄露风险
  • 拼多多商家电话采集 拼多多店铺爬虫软件使用教程
  • RK3566 MIPI屏调试记录
  • 爬虫数据模拟真实设备请求头User-Agent生成(fake_useragent:一个超强的Python库)
  • 【教育宝-注册安全分析报告】
  • 3.达梦数据库基础运维管理
  • 【Linux】【系统纪元】Linux起源与环境安装
  • Android笔试面试题AI答之Activity(9)
  • 什么是嵌入式
  • SAM 2:Segment Anything in Images and Videos 论文详解
  • PYTHON专题-(10)基操之我要玩并发
  • 双指针实现删除字符串中的所有相邻重复项
  • vue(vue2和vue3)项目打包去除console.log
  • Visual Studio 2022社区版、专业版、企业版功能对比表
  • Codeforces 888 div3 A-G
  • IDEA如何去掉编辑框右侧的竖线