zoukankan      html  css  js  c++  java
  • const和define的区别

    C++中不但可以用define定义常量还可以用const定义常量,它们的区别如下:

    1、编译器处理方式不同
      define宏是在预处理阶段展开。
      const常量是运行阶段使用。
    2、类型和安全检查不同
      define宏没有类型,不做任何类型检查,仅仅是展开。
      const常量有具体的类型,在编译阶段会执行类型检查。
    3、存储方式不同
      define宏不分配内存,给出的是立即数,有多少次使用就进行多少次替换,在内存中会有多个拷贝,消耗内存大。
        const常量会分配内存(可以是堆中也可以是栈中),在程序运行过程中内存中只有一个拷贝
    4、在编译时, 编译器通常不为const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高。
    宏替换只作替换,不做计算,不做表达式求解。
    5、有些集成化的调试工具可以对const常量进行调试,但是不能对宏常量进行调试。
    6、define宏不可以用指针变量去指向的,const常量可以用指针去指向该常量的地址的。
    7、用define可以定义一些简单的函数,const是不可以定义函数的。
    8、宏定义的作用范围仅限于当前文件。
    默认状态下,const对象只在文件内有效,当多个文件中出现了同名的const变量时,等同于在不同文件中分别定义了独立的变量。
    如果想在多个文件之间共享const对象,必须在变量定义之前添加extern关键字(在声明和定义时都要加)。
    9、有时希望某些常量只在类中有效。由于#define定义的宏常量是全局的,不能达到目的,于是想当然地觉得应该用const修饰数据成员来实现。const数据成员的确是存在的,但其含义却不是所期望的。const数据成员只在某个对象生存期内是常量,而对于整个类却是可变的,因为类可以创建多个对象,不同的对象其const数据成员的值可以不同。

    枚举常量不会占用对象的存储空间,它们在编译时被全部求值。枚举常量的缺点是:它的隐含数据类型是整数,其最大值有限,且不能表示浮点数(如PI=3.14159)。

  • 相关阅读:
    Checking Types Against the Real World in TypeScript
    nexus pip proxy config
    go.rice 强大灵活的golang 静态资源嵌入包
    几个golang 静态资源嵌入包
    rpm 子包创建学习
    Rpm Creating Subpackages
    ava 类似jest snapshot 功能试用
    ava js 测试框架基本试用
    The Architectural Principles Behind Vrbo’s GraphQL Implementation
    graphql-compose graphql schema 生成工具集
  • 原文地址:https://www.cnblogs.com/xidian2014/p/8608243.html
Copyright © 2011-2022 走看看