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不可以

    宏可以使代更码简洁

    使用宏可以方便代码维护

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

  • 相关阅读:
    wget一个小技巧
    【iOS官方文档翻译】UICollectionView与UICollectionViewFlowLayout
    NSDate获取当前时区的时间
    怎样把一个字典的数据添加到另一个字典中?
    CoreLocation基本使用
    iOS开发--一步步教你彻底学会『iOS应用间相互跳转』
    Save Image to UserDefaults(用NSUserDefaults保存图片)
    SDWebImage源码解析
    获取cell或者cell中的控件在屏幕中的位置
    Git命令详解 123
  • 原文地址:https://www.cnblogs.com/WindSun/p/11434422.html
Copyright © 2011-2022 走看看