zoukankan      html  css  js  c++  java
  • const与#define的区别、优点

    const与#define的区别

    编译器处理方式不同

    define宏是在预处理阶段展开。

    补充:预处理器根据以#开头的命令,修改原始的程序。比如我们常见的#include <stdio.h>命令告诉处理器读取系统头文件stdio.h的内容,并把它直接插入程序文本中。咱们的#define也是,仅仅是单纯的文本替换。

    const常量是编译运行阶段使用。

    类型和安全检查不同

    define宏没有数据类型,不做任何类型检查,仅仅是展开。

    const常量有具体的数据类型,在编译阶段会执行类型检查。

    存储方式不同

    define宏仅仅是展开,有多少地方使用,就展开多少次,不会分配内存。

    const常量会在内存中分配(可以是堆中也可以是栈中)。

    const  可以节省空间,避免不必要的内存分配。

    例如:

    #define PI 3.14159 //常量宏  
    const doulbe Pi=3.14159; //此时并未将Pi放入ROM中
    double i=Pi; //此时为Pi分配内存,以后不再分配!  
    double I=PI; //编译期间进行宏替换,分配内存  
    double j=Pi; //没有内存分配  
    double J=PI; //再进行宏替换,又一次分配内存!  
    

    const定义常量从汇编的角度来看,只是给出了对应的内存地址,而不是象#define一样给出的是立即数,所以,const定义的常量在程序运行过程中只有一份拷贝,而 #define定义的常量在内存中有若干个拷贝。

    代码调试不同

    const常量可以进行调试的。

    define是不能进行调试的,因为在预编译阶段就已经替换掉了。

    const优点

    const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误。

    有些集成化的调试工具可以对const常量进行调试,但是不能对宏常量进行调试。

    const可节省空间,避免不必要的内存分配,提高效率。

    #define的优点

    宏可以定义一些函数,const不可以

    宏可以使代更码简洁

    使用宏可以方便代码维护

    宏还可以定义带参数的宏,做到一定程度的泛型(利用#或者##操作符)

  • 相关阅读:
    influxdb时序数据库之随想其他列式存储数据库
    ss 命令参数 redis-benchmark 以及POSTMAN, CURL分析网络
    HTTP2.0
    我的2020工作总结
    2021-03-31 JDK8 字符串常量池
    try catch与spring的事务回滚
    Spring主动触发事务回滚
    Redis五种数据类型及应用场景
    java面试题
    ubuntu linux mysql 安装 基本操作 命令
  • 原文地址:https://www.cnblogs.com/WindSun/p/11434422.html
Copyright © 2011-2022 走看看