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

【c++八股文】Day3:inline与define与constexpr

inline vs #define vs constexpr 总结

特性 / 关键词#defineinlineconstexpr
所属阶段预处理阶段编译阶段编译阶段
作用对象宏(可替代函数或常量)函数(有时用于类内定义)常量(或常量表达式函数)
类型检查❌ 无类型检查✅ 有类型检查✅ 有类型检查
安全性❌ 易出错(副作用、优先级)✅ 安全(与普通函数等价)✅ 安全(编译期常量)
替换方式文本替换语义替换(函数调用)语义替换(常量值)
调试支持❌ 行号不准确✅ 好调试✅ 好调试
是否推荐❌ 不推荐✅ 推荐用于小函数✅ 强烈推荐用于常量表达式
多次求值风险✅ 有(比如 x++ 会求多次)❌ 没有❌ 没有
主要用途旧式宏,定义常量/宏函数小函数内联优化、类内函数定义编译期常量、constexpr函数

✅ 举例对比

1. #define

#define PI 3.14159
#define SQUARE(x) ((x) * (x))

问题:

  • 没有作用域控制
  • 没有类型检查
  • 参数可能多次求值导致副作用

2. inline

inline int square(int x) { return x * x; }

优势:

  • 类型安全
  • 编译器可选择是否展开(非强制)
  • 支持函数重载、命名空间、类作用域等现代特性

3. constexpr

constexpr double pi = 3.14159;
constexpr int square(int x) { return x * x; }

优势:

  • 支持常量表达式计算
  • 类型安全,可用于数组大小、模板参数等场景
  • 编译期求值,生成效率高

🧠 总结口诀(便于记忆八股文)

#define 替文本,类型不检易出事;
inline 是函数,检查类型可内联;
constexpr 定常量,编译期算最安全。
现代 C++:弃宏用常量,用函数就 inline。
http://www.dtcms.com/a/257924.html

相关文章:

  • Flotherm许可使用监控
  • Flink中的反压与背压:原理、检测与应对
  • Origin绘制三Y轴柱状图、点线图、柱状点线图
  • 单片机——浮点数转换4位数码管显示
  • inotify-cpp 使用
  • [特殊字符] OpenCV opencv_world 模块作用及编译实践完整指南
  • Node.js特训专栏-实战进阶:7.Express模板引擎选型与使用
  • uniapp打包apk后实现APP消息通知详细教程
  • 【Spring】系统化的 Spring Boot 全栈学习教程,涵盖基础配置、核心功能、进阶实战及文档自动生成
  • 在Springboot项目部署时遇到,centos服务器上,curl请求目标地址不通 ,curl -x 可以请求通的解决办法
  • Spring Bean生命周期(基于spring-beans-6.2.6分析)
  • Bootstrap 5学习教程,从入门到精通,Bootstrap 5 提示框(Tooltips) 语法知识点及案例(21)
  • uniapp:微信小程序胶囊「复制链接」灰色处理
  • EEG分类 - Theta 频带 power
  • JimuReport:一款免费的数据可视化报表工具
  • GitLab 17.8 备份秘籍:快速获取纯 Git 仓库与核心配置
  • Word2Vec 原理是什么
  • Learning PostgresSQL读书笔记: 第1章 Introduction to PostgreSQL
  • 【AI 测试】测试用例设计:人工智能语言大模型性能测试用例设计
  • 【数码管向左出现与消失滚动“456789Ab”】2022-4-25
  • 【数据结构】_二叉树OJ第二弹(返回数组的遍历专题)
  • 如何利用Charles抓包工具提升API调试与性能优化
  • 【Java面试】什么是一致性Hash算法
  • 原生微信小程序网络请求与上传接口封装实战指南
  • 黑马程序员苍穹外卖DAY1
  • Java 程序设计试题​
  • 拼多多API限流机制破解:分布式IP池搭建与流量伪装方案
  • 从 0 到 1 构建 Graph RAG 系统:本地图谱 + 通义千问落地实践
  • OVS Faucet练习(下)
  • matlab实现大地电磁二维正演