c语言关键字-#define,const,enum 区别
一、简述三种关键字使用
- const:定义常变量,即只读变量。
- enum:枚举类型,在实际问题中有些变量的取值被限定在一定的范围内,例如一个星期七天,一年十二个月,如果把这些变量说明为整形,字符型等类型显然是不合适的,为此有了enum枚举类型,在枚举类型的定义中列举出所有可能的值,被说明为该类型的变量取值范围不能超过定义的范围。
- #define宏定义用宏名来表示一个字符串,字符串可以包含任何字符,可以是常数,也可以是表达式,只是一种简单的文本替换。预处理器不对其做任何检查,如果有错误只能在编译已经被宏展开的源程序时发现
二、#define,const,enum的区别
1.编译器处理方式不同
- #define:在预编译阶段进行替换,不做数据类型安全检查,只是替换
- const:在编译运行阶段使用,会执行类型安全检查,如果出现错误编译器会报错
- enum:在程序运行时起作用
2.分配内存不同
- #define:在预编译阶段不分配内存,只是进行替换与展开,在于编译之后当有变量调用这个宏时才会分配一份内存,
- const:const常量编译器会分配内存,在堆或者栈
- enum:enum变量则存储在数据的静态存储区
3.编译检查
- #define:宏定义没有类型检查与安全检查,容易出现不可预知的错误
- const:在编译阶段进行类型与安全检查
- enum:在编译阶段进行类型检查
4.内存拷贝
- const常变量在内存中的地址是固定的,是一个固定的内存地址,#define给出的是立即数;所以const定义的常量在程序中只有一份拷贝,而#define定义的常量在内存中有若干个拷贝
-
#define a 3.14159 //常量宏 const doulbe b=3.14159; //此时并未将b放入ROM中 ...... double i=b; //此时为b分配内存,以后不再分配! double I=a; //编译期间进行宏替换,分配内存 double j=b; //没有内存分配 double J=a; //再进行宏替换,又一次分配内存!