#define宏定义和const及enum枚举的区别
#define p 10
const int p=10;
enum p
{a;
b;
}k;
enum简单扩展:
a和b成为枚举元素或者枚举常量,编译器会对他们按定义的顺序赋值为1,2,3,........
k为枚举变量,它的值是可以输出的。但是不能对枚举变量直接赋予一个整值,必须进行类型强转才能赋。
例如k=(p)2;这个语句的意思是将枚举元素顺序号为2的元素赋值给k,相当于k=b;
(1)编译器处理方式不同
#define是在预处理阶段对所定义的常量进行替换展开;
const是在编译运行阶段使用;
enum是程序运行时起作用;
(2)分配内存不同
#define宏定义仅仅是替换和展开,并不进行内存的分配(宏定义不分配内存,常量的定义分配内存);
const常量编译器会分配内存,在堆或者栈;
enum常量存储在内存数据段的静态存储区。
延伸:在C语言里,const的含义是被称为一个不能被改变的普通变量,而在C++中其含义就不尽相同。C++中的const常量,C++编译器都会尽量避免const 常量的内存分配,只有当不得已的时候才会分配具体的内存空间给const变量。
例子
(1)
由反汇编代码看出j的值是从a的内存空间中取出值赋给j的存储空间;
(2)
由const定义的常变量的值是直接赋给j的存储空间,而不对其值进行存储,放在常量表中或是直接使用其值。
(3)类型检查
#define宏定义没有类型检查和安全检查,所以会导致边际效应,出现不可预知的错误;
const在编译阶段进行类型检查和安全检查;
enum在编译阶段进行类型检查,但是只能进行整形的定义;