const 和 #define 的区别

const 和 #define 的区别

1. 编译阶段不同

  • #define预处理阶段直接文本替换,不做语法检查
  • const编译阶段处理,有类型检查、语法检查

2. 类型不同

  • #define:无类型,只是纯文本替换,容易出隐式类型错误
  • const:有明确类型(int、double 等),编译器会做类型校验

3. 作用域不同

  • #define:全局生效,从定义处到文件末尾,跨文件也可能生效
  • const:遵循作用域,局部const只在局部有效,类内const属于类

4. 内存占用不同

  • #define:不分配内存,只是替换文本
  • const:会分配内存(除编译期优化),有地址,可以取地址

5. 可否调试

  • #define:无法调试,预处理直接替换,调试看不到宏
  • const:可调试,是真正变量,调试器可识别

6. 能否做函数形参/类成员

  • #define 不行
  • const 可以修饰函数参数、成员变量、成员函数

7. 宏的坑

cpp 复制代码
#define N 1+2
int a = N*3;  // 实际是 1+2*3=7,不是9

const 不会出现这种运算优先级问题。


面试口述

  1. #define 是预处理文本替换,无类型,不检查语法;const 是编译期常量,有类型,编译器做类型检查。
  2. #define 作用域全局,const 遵循作用域规则。
  3. 宏不占用内存,const 占用内存;宏无法调试,const 可以调试。
  4. 宏容易出现运算优先级问题,const 不会。
  5. C++ 中优先使用 const 代替 #define
相关推荐
晚风予卿云月8 小时前
《二分答案》算法练习
数据结构·c++·算法·二分·竞赛·算法随笔
郭涤生8 小时前
C++ 各类数据的内存分区与读写性能详解
开发语言·c++
j_xxx404_8 小时前
Linux 线程日志系统设计:从策略模式、RAII 到 pthread 线程安全与内核写入路径|附源码
linux·运维·服务器·开发语言·c++·人工智能·策略模式
飞天狗1118 小时前
2025第十六届蓝桥杯c/c++B组国赛题解
c语言·c++·算法·蓝桥杯
努力努力再努力wz8 小时前
【Qt入门系列】:QLabel控件详解:从文本显示到图片展示,再到内容布局与伙伴机制
android·开发语言·数据结构·数据库·c++·qt·mysql
散峰而望9 小时前
【算法练习】算法练习精选:从 Phone numbers 到 Decrease,覆盖字符串、模拟、图论思维题
数据结构·c++·算法·贪心算法·github·动态规划·图论
薇茗9 小时前
【C++】 基础语法篇
c++·c++基础语法
并不喜欢吃鱼9 小时前
从零开始 C++----- 十二【C++ 数据结构】map/set 全解析:从使用到红黑树底层模拟实现
开发语言·数据结构·c++
不会C语言的男孩9 小时前
C++ Primer Plus 第17章:输入、输出和文件
开发语言·c++
j_xxx404_9 小时前
Linux 线程同步硬核解析:从条件变量、阻塞队列到信号量环形队列
linux·运维·服务器·c++·人工智能·ai·中间件