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; //再进行宏替换,又一次分配内存!
原文地址:https://www.cnblogs.com/southcyy/p/10172572.html