(1)预处理 vs 编译时
#define 是预处理指令,它在编译之前进行文本替换,将符号替换为相应的文本;const 是编译时定义的常量,在编译过程中进行类型检查和符号解析。
(2)符号替换 vs 内存分配
#define 是简单的文本替换,它将符号替换成相应的文本,没有内存分配;const 定义的常量会在内存中分配存储空间。
(3)类型检查
const 可以进行类型检查,它具有类型安全性。编译器可以检查 const 常量的类型,确保其正确使用;而 #define 是简单的文本替换,没有类型检查,容易出现潜在的类型错误。
(4)作用域
#define 没有作用域限制,它的定义在预处理阶段,全局有效;const 有作用域限制,它的作用范围可以是函数内部、代码块或文件内部,具体取决与它的定义位置。
(5)地址获取
const 定义的常量在内存中分配了存储空间,可以获取其地址;而 #define 定义的常量没有分配存储空间,没有对应的地址。
综上所述,#define 用于简单的文本替换,适用于一些常量表达式、宏定义和条件编译等场景。而 const 更适合定义具有类型和作用域的常量,它具有类型安全性,可以进行类型检查,并且在内存中分配存储空间。在 C 语言中,推荐使用 const 来定义常量,以提供更好的类型检查和代码可读性。