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 不会出现这种运算优先级问题。
面试口述
- #define 是预处理文本替换,无类型,不检查语法;const 是编译期常量,有类型,编译器做类型检查。
- #define 作用域全局,const 遵循作用域规则。
- 宏不占用内存,const 占用内存;宏无法调试,const 可以调试。
- 宏容易出现运算优先级问题,const 不会。
- C++ 中优先使用 const 代替 #define。