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

网站空间商排名罗庄网站建设

网站空间商排名,罗庄网站建设,制作公司网页要多长时间,网络营销的具体形式种类非常棒的问题,这几个关键字(const、constexpr、#define)都可以用来表示“常量”,但它们意义、作用时机和参与编译的方式完全不同,理解这些对掌握 C 编译模型和写出高质量代码非常重要。 我们从用途、语义、生命周期、编…

非常棒的问题,这几个关键字(constconstexpr#define)都可以用来表示“常量”,但它们意义、作用时机和参与编译的方式完全不同,理解这些对掌握 C++ 编译模型和写出高质量代码非常重要。

我们从用途、语义、生命周期、编译阶段、类型检查、作用域、性能优化等维度系统性整理:


✅ 一、先看三者的简要对比

特性/关键词#defineconstconstexpr
类型安全❌(纯文本替换)✅(有类型)✅(有类型,且编译期常量)
编译阶段预处理阶段编译阶段编译阶段(要求常量表达式
编译器可见性❌(对编译器不可见)✅(符号存在)✅(符号存在且常量可折叠)
优化能力差(不利于调试优化)较好最佳
可以取地址✅(在符号表中)✅(但可能折叠为立即数)
支持复杂类型❌(只能是文本)
可用于数组长度✅(C++11起)
常量表达式限制不要求是编译期常量必须是编译期常量表达式

🧩 二、编译器行为层面解释

1. #define:预处理阶段文本替换

#define PI 3.14

🔍 行为:

  • 预处理阶段,编译器会把 所有出现 PI 的地方直接替换为 3.14
  • 编译器看不到 PI 这个标识符,调试器、类型系统也看不到
  • 不参与类型检查、作用域控制

📌 不推荐:

#define SQUARE(x) x * x
int y = SQUARE(1 + 2);  // → 展开为 1 + 2 * 1 + 2 → 错误

2. const:在编译阶段处理的只读变量

const double pi = 3.14;

🔍 行为:

  • pi 是一个具有类型和作用域的符号
  • 编译器会参与类型检查
  • 可以取地址(存在符号表中)
  • 如果优化器看到它不变,可能优化为立即数

📌 示例:

const int N = 10;
int arr[N];  // C++11 起允许

3. constexpr:编译阶段就能求值为常量的表达式

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

🔍 行为:

  • 要求变量或函数在编译期间就能确定值

  • 编译器会强制执行常量折叠(constant folding)

  • 可用于:

    • 数组大小
    • 模板参数
    • 枚举值
    • if constexpr 语句分支
  • 可定义常量表达式函数

📌 示例:

constexpr int N = square(3); // N = 9,在编译期完成计算
int arr[N];                  // 数组大小合法

⚠️ 三者在调试器中的差异

内容类型在调试器中是否可见是否能打断点是否能取地址
#define❌ 不可见(被替换掉)❌ 无法断点
const✅ 可见(有符号名)✅ 可以断点
constexpr⚠️ 可能折叠优化掉❌ 不一定能断点❌ 常常变成立即数

✅ 四、代码层级对比示例

#define LEN 100                     // 无类型,只是 100 的文本替换const int len1 = 100;              // 有类型,支持类型检查,可能折叠
constexpr int len2 = 100;          // 编译期常量,支持最强优化int arr1[LEN];   // ✅
int arr2[len1];  // ✅(C++11 起)
int arr3[len2];  // ✅(优先推荐)

🎓 五、适合用于什么场景?

使用场景推荐选项原因
简单常量替代constexpr类型安全 + 编译期求值 + 优化好
宏函数inline constexpr function避免宏展开错误,可调试
魔法数字、配置参数constexpr or const类型安全、可调试
条件编译(平台相关)#ifdef/#define预处理器语法只在这类场景合法
定义模板参数或数组大小constexpr编译期要求常量

✅ 六、语义分层总结图

       ┌────────────────────────────┐│       #define PI 3.14      │ ← 预处理,替换文本,无类型、无调试信息└────────────────────────────┘↓┌────────────────────────────┐│  const double pi = 3.14;   │ ← 有类型,有符号,有作用域,可调试└────────────────────────────┘↓┌────────────────────────────┐│ constexpr double pi = 3.14;│ ← 编译期常量表达式,最优性能和安全性└────────────────────────────┘

✅ 七、一句话总结

#define 是预处理器的文本替换,完全不参与类型系统;const 是只读变量,具有类型和作用域;constexpr 是编译期可求值的常量表达式,是现代 C++ 推荐的写法,支持最强类型安全与编译优化。


文章转载自:

http://acfSc9QR.kmqwp.cn
http://vtWPvTpF.kmqwp.cn
http://0Z5BoqGI.kmqwp.cn
http://XACtu1dH.kmqwp.cn
http://ba4HHRVF.kmqwp.cn
http://UYOmbOF9.kmqwp.cn
http://ghhKntAF.kmqwp.cn
http://6v6FbCnM.kmqwp.cn
http://j7EIJT1k.kmqwp.cn
http://XHSp2j2e.kmqwp.cn
http://TR7nyS7m.kmqwp.cn
http://gF65x869.kmqwp.cn
http://FYL1luQF.kmqwp.cn
http://QDLdtGuU.kmqwp.cn
http://V9Nq7MKw.kmqwp.cn
http://Kcia7h78.kmqwp.cn
http://gBK3WsyD.kmqwp.cn
http://1EDljswx.kmqwp.cn
http://0slKPMHc.kmqwp.cn
http://slwG8Zdy.kmqwp.cn
http://x0BmB7po.kmqwp.cn
http://l9YFufyb.kmqwp.cn
http://ILuCDAAv.kmqwp.cn
http://d4hqSQlS.kmqwp.cn
http://zA58d13k.kmqwp.cn
http://I6ZacFo1.kmqwp.cn
http://yLibdpgl.kmqwp.cn
http://lgFEY2eu.kmqwp.cn
http://3AxK2iXd.kmqwp.cn
http://eX1Gqou5.kmqwp.cn
http://www.dtcms.com/wzjs/731109.html

相关文章:

  • 如何做招生网站深圳市城市建设管理局
  • 泰安网站建设个人工作室织梦网站必须下载
  • 重庆网站建设定制谷歌seo关键词优化
  • 长春人才网招聘余姚网站seo运营
  • 网站建设中数据字典招标网平台
  • 多域名指向同一网站内网网站建设改版方案
  • ppt模板下载免费素材网站注册微信
  • 安徽省建设厅执业资格注册中心网站网络营销推广公司网站有哪些
  • 二维码制作app怎么关闭seo查询
  • 建设家居网站站酷网站建设
  • win7记事本做网站网页设计作品展
  • 网站建设公司怎么宣传国内软件开发
  • 如何利用网站做产品推广网页设计与制作项目教程陈义文
  • 手机网站建设服务器长沙app网站开发
  • 百度网址大全网站网站制作 常见问题
  • 苏州网站建设网站网站设计中的div是什么
  • 2018年主流网站开发语言电子商务专升本可以报什么专业
  • 江苏有哪些做网站建设的公司企业网站建设与维护
  • 高中信息技术网站设计规划晋江住房和城乡建设局网站
  • 建网站主要工具用了采集站域名做网站
  • 有空间与域名 怎么做网站网站建设中网页代码
  • 专做专业课视频的网站网站布局策划的流程图
  • 贵州国龙翔建设有限公司网站男通网站哪个好用
  • 热门的网站模板下载北京app搭建
  • python云服务器网站开发实例网站运营
  • 在线免费货源网站入口网站信息更新如何做
  • 外贸网站建设哪里做得好企业网站制作的软件
  • 贵州网站制作设计公司哪家好延边省建设局网站官网
  • 网站导航仿站西安短视频代运营
  • 如何建设网站建设现在做个网站要多少钱