
#define 只是用来做文本替换的例如c1 #define PI 3.14159262 float angel;3 angel 30 * PI / 180;那么当程序进行编译的时候编译器会首先将 #define PI 3.1415926 以后所有代码中的“PI”全部换成“3.1415926”然后再进行编译。因此#define常量的生命周期止于编译期它存在于程序的代码段在实际程序中它只是一个常数一个命令中的参数并没有实际的存在。const 常量存在于程序的数据段并在堆栈中分配了空间。const常量是一个Run-Time的概念它在程序中确确实实地存在着并可以被调用、传递。const常量有数据类型而宏常量没有数据类型。编译器可以对const常量进行类型安全检查。1. 类型检查#define 无类型纯文本替换不会做类型校验容易出现类型错误。const 有明确数据类型编译器做类型检查更安全。2. 内存占用#define 不占用内存只是文本替换。const 会分配内存C常有些优化放到符号表。3. 作用域#define 从定义开始直到文件末尾不受作用域限制可以 #undef 取消。const 遵循变量作用域规则局部const只在函数内有效。4. 调试const 调试器可以看到这个变量#define 预处理阶段就被替换掉调试看不到宏名。一句话#define是预处理文本替换无类型不占内存const是带类型的常量编译器做类型检查占用内存支持调试