zoukankan      html  css  js  c++  java
  • 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; //再进行宏替换,又一次分配内存!
  • 相关阅读:
    Cordova 配置文件
    Mac 配置gradle环境变量
    React实现TabBar切换,带动画效果
    【Mac】基于Android Studio搭建cordova开发环境
    Spring之IOC控制反转
    Spring Boot笔记三:Spring Boot之日志
    Spring Boot笔记二:Spring Boot配置文件
    java的代理机制
    Spring Boot笔记一:Spring Boot入门
    Spring Boot笔记
  • 原文地址:https://www.cnblogs.com/southcyy/p/10172572.html
Copyright © 2011-2022 走看看