1.编译器处理方式不同
define宏是预处理阶段展开
const常量是编译运行阶段使用
define是宏定义,程序在预处理阶段将用define定义的内容进行替换,因此程序运行时常量表中并没有用define定义的常量,系统不为其分配内存。
const常量是编译运行时的常量,系统为其分配内存。
2.类型跟安全检查不同
define宏没有类型,不做任何类型检查,仅仅是展开
const常量有具体的类型,编译运行时会执行类型检查
3.存储方式不同
define仅仅是展开,有多少地方使用就展开多少次,不分配内存
const常量会在内存中分配(可以在堆中也可以在栈中)
4.const可以节省空间,避免不必要的的内存分配。
define注意“边缘效应”,
例:#define N 2+3 //N的值是5
int a = N/2,//在编译时我们预想a=2.5,实际打印结果是3.5
原因是在预处理阶段,编译器将a=N/2处理成a=2+3/2,这就是define宏的边缘效应;
所以我们应该写成#define N (2+3)