专栏首页编程技术专栏const与#define的区别、优点
原创

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

宏可以使代更码简洁

使用宏可以方便代码维护

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

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 制作和上传C/C++包到xmake的官方仓库

    xmake集成了内置的远程包依赖管理,用户只需要简单地在项目中添加自己所需要的包和版本,即可自动下载和集成对应的包到项目中,并且实现编译和链接。

    ruki
  • xmake vs cmake对比分析

    首先,不得不承认,cmake很强大,发展了这么多年,整个生态已经相当完善,功能也相当丰富,这点xmake目前是比不了的。

    ruki
  • 每日算法题:Day 10

    输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵:1 2 3 4 5 6 7 8 9 10 11 12 13 14...

    算法工程师之路
  • Django下重用自己写的app

    设计、构建、测试和维护一个网页应用有许多工作要做。许多Python 和 Django 项目都有常见的共同问题。可重用将会节省这些重复性工作。

    菲宇
  • xmake v2.2.7 发布, 改进Cuda项目构建

    这个版本主要对Cuda项目的构建做了很多的改进,并且新增了对lex/yacc编译支持,同时也对target新增了on_link, before_link和aft...

    ruki
  • Java 11 正式发布,这 8 个逆天新特性教你写出更牛逼的代码

    美国时间 09 月 25 日,Oralce 正式发布了 Java 11,这是据 Java 8 以后支持的首个长期版本。

    用户5224393
  • 程序员C语言快速上手——工程篇(十二)

    其实学完C语言的语法后,我们往往会有数不清的疑惑,例如编译器在编译的时候就可以分配内存,那么不同的程序会不会分配到相同的内存地址,计算机如何处理这种冲突?C语言...

    arcticfox
  • Idea 插件 lombok 的安装和使用

    原文链接:https://www.cnblogs.com/lyosaki88/p/11046014.html

    微风-- 轻许--
  • Django之Transform和lookup类

    Transform是用于实现字段转换的通用类。一个显然的例子是__year会把DateField转换为IntegerField。 在表达式中执行查找的标记是T...

    菲宇
  • 5分钟实践腾讯云+redis实战

    Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。从2010年3月15日...

    用户5224393

扫码关注云+社区

领取腾讯云代金券