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

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

文章目录

  • 条款 02:尽量以 `const`,`enum`,`inline` 替换 `#define`
    • 1. 用 `const` 或 `enum` 替代单纯常量的 `#define`
      • 问题
      • 改进
    • 2. 用 `inline` 函数替代形似函数的宏
      • 问题
      • 改进
    • 关键点总结

条款 02:尽量以 constenuminline 替换 #define

在 C++ 中,#define 提供了简单的文本替换功能,但它存在诸多问题,例如缺乏类型检查、可能导致参数多次计算等。更安全和现代的替代方案是使用 constenuminline

1. 用 constenum 替代单纯常量的 #define

问题

使用 #define 定义常量时,编译器仅进行简单的文本替换,缺乏类型安全,且不受作用域控制。例如:

#define PI 3.14159

改进

可以使用 const 对象或 enum 来替代:

  • const 提供类型安全,并且具有明确的作用域。
  • enum 适用于定义一组相关的常量,并且编译器会对其进行优化。

示例:

const double Pi = 3.14159;
enum Color { Red, Green, Blue };


2. 用 inline 函数替代形似函数的宏

问题

使用 #define 定义的宏函数(macros)存在以下问题:

  • 缺乏类型检查,容易引发错误。
  • 参数可能被多次计算,导致性能问题或意外的副作用。

例如:

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

调用 CALL_WITH_MAX(x++, y++) 时,xy 会被多次递增,可能导致不可预期的行为。

改进

使用 inline 函数可以避免这些问题:

  • 提供类型检查,保证安全性。
  • 参数只会被计算一次,避免副作用。
  • 更具作用域控制,提升代码可读性。

示例:

template <typename T>
inline void callWithMax(const T& a, const T& b)
{
f(a > b ? a : b);
}


关键点总结

  1. 优先使用 constenum 替代常量宏:提升类型安全性和代码可读性。
  2. 优先使用 inline 函数替代宏函数:避免潜在副作用并支持类型检查。
  3. 尽量减少对 #define 的依赖:仅在预处理场景中使用(如头文件保护)。

通过这些改进,可以大幅提升代码的安全性、性能和可维护性。


http://www.kler.cn/a/449870.html

相关文章:

  • mapbox基础,加载mapbox官方地图
  • 【YashanDB知识库】jdbc查询st_geometry类型的数据时抛出YAS-00101错误
  • Java 优化springboot jar 内存 年轻代和老年代的比例 减少垃圾清理耗时 如调整 -XX:NewRatio
  • IntelliJ IDEA 快捷键大全:提升开发效率的利器
  • 北京中小学信息学编程能力测评 BCSP-X 2024 下半年 真题汇总
  • stm32制作CAN适配器5--WinUsb上位机编写
  • 递归查询全量分页数据问题
  • C++---------随机库,standfor库
  • 16×16LED点阵字符滚动显示-基于译码器与移位寄存器(设计报告+仿真+单片机源程序)
  • IMX6ULL开发板如何关掉自带的QT的GUI界面和poky的界面的方法
  • [spring]处理器
  • SpringCloudGateway+Nacos注册与转发Netty+WebSocket
  • 02-8.python入门基础一函数的高级使用
  • 一次性部署:使用Docker部署PHP应用
  • 源码分析之Openlayers中ZoomSlider滑块缩放控件
  • 【C语言】深入探讨 C 语言 `int` 类型大小及其跨平台影响
  • 【机器人】ATM 用于策略学习的任意点轨迹建模 RSS 2024 | 论文精读
  • 音视频入门基础:MPEG2-TS专题(20)——ES流简介
  • 取多个集合的交集
  • Spring Boot @Conditional注解
  • 设计模式--工厂方法模式【创建型模式】
  • [vLLM vs TensorRT-LLM] :系统调度schedule比较
  • 浅谈算法交易
  • MySQL表名传参SP
  • Linux文件目录 --- 复制命令CP、递归复制目录、软连接、硬链接
  • Windows开启IIS后依然出现http error 503.the service is unavailable