编译器处理不同
宏定义是一个“编译时”概念,在预处理阶段展开(在编译时把所有用到宏定义值的地方用宏定义常量替换),不能对宏定义进行调试,生命周期结束于编译时期;
const常量是一个“运行时”概念,在程序运行使用,类似于一个只读行数据

存储方式不同
宏定义是直接替换,不会分配内存,存储与程序的代码段中;
const常量需要进行内存分配

类型和安全检查不同
宏定义是字符替换,没有数据类型的区别,同时这种替换没有类型安全检查,可能产生边际效应等错误;
const常量是常量的声明,有类型区别,需要在编译阶段进行类型检查

定义域不同
复制代码

void f1 ()
{#define N 12const int n 12;}void f2 ()
{cout<<N <<endl; //正确,N已经定义过,不受定义域限制cout<<n <<endl; //错误,n定义域只在f1函数中
}

是否可以做函数参数
宏定义不能作为参数传递给函数
const常量可以在函数的参数列表中出现

定义后能否取消
宏定义可以通过#undef来使之前的宏定义失效
const常量定义后将在定义域内永久有效

void f1()
{
#define N 12
const int n = 12;

#undef N //取消宏定义后,即使在f1函数中,N也无效了
#define N 21//取消后可以重新定义
}

总结
宏定义在编译时把所有用到宏定义值的地方用宏定义常量替换。const常量可以看作是一个只读变量,需要指定类型,需要分配内存,有自己的作用域。

参考博客
https://www.cnblogs.com/scut-linmaojiang/p/4722338.html

https://blog.csdn.net/weibo1230123/article/details/81981384

const(常量)和#define(宏定义)区别相关推荐

  1. const常量与define宏定义的区别

    #define RADIUS 100; const  float   RADIUS = 100; (1) 编译器处理方式不同 define宏是在预处理阶段展开. const常量是编译运行阶段使用. ( ...

  2. C语言基础知识之define宏定义表达式,undef,内存对齐,a和a的区别,数组知识点,int (*)[10] p,二维数组参数与二维指针参数,函数指针数组,常见的内存错误及对策

    一.用define宏定义表达式 1.定义一年有多少秒: #define SEC_A_YEAR 60*60*24*365 //上述描述不可靠,没有考虑到在16位系统下把这样一个数赋给整型变量的时候可能会 ...

  3. #define宏定义是什么?怎么写?一文搞懂。

    前言 第一次接触宏定义的时候,是在学校的C++课程大作业中.当时有幸看到了大佬写的源码,里面有很多的宏定义.当时并不了解宏定义的妙用,只感觉它像是定义了一个变量一样,不好理解还有些多此一举. 这之后在 ...

  4. typedef与宏定义区别

    typedef与宏定义区别 个人觉得这篇文章写得非常好,就转了.我转载的这篇文章的地址为http://i.mtime.com/ocgcyj/blog/5693781/. 陷阱一: 记住,typedef ...

  5. 枚举enum与#define 宏的区别?

    枚举enum与#define 宏的区别? 1)#define 宏常量是在预编译阶段进行简单替换.枚举常量则是在编译的时候确定其值. 2)一般在编译器里,可以调试枚举常量,但是不能调试宏常量. 3)枚举 ...

  6. define宏定义中的#,##,@#及\符号

    define宏定义中的#,##,@#及\符号 在#define中,标准只定义了#和##两种操作.#用来把参数转换成字符串,##则用来连接两个前后两个参数,把它们变成一个字符串. 1.# (string ...

  7. 关于C语言刷题(#define宏定义函数的常见错误)

    关于C语言刷题(#define宏定义函数的常见错误) 首先我们来先看对#define的定义 define,宏定义,C语言中预处理命令一种.分为无参宏定义和带参宏定义.无参宏定义的一般形式为:#defi ...

  8. define宏定义和const定义之间的区别

    define部分: 宏不仅可以用来代替常数值,还可以用来代替表达式,甚至是代码段.(宏的功能很强大,但也容易出错,所以其利弊大小颇有争议.) 宏的语法为: #define 宏名称 宏值 注意,宏定义不 ...

  9. const与#define宏定义的区别——C语言深度剖析

    const定义的只读变量在程序运行过程中只有一份拷贝(因为它是全局的只读变量,存放在静态区),而#define定义的宏常量在内存中有若干个拷贝. #define宏是在预编译阶段进行替换,而const修 ...

  10. 关于C语言define宏定义字符串常量

    1.问题由来: 本人一直以为宏对于字符串的处理也是直接在预处理时进行替换:但是最近在工作中遇到了字符串宏+1的情况:于是彻底的颠覆了以前的思维:于是乎进行测试验证得出以下结果. 2.测试代码 /*测试 ...

最新文章

  1. 还在使用Future轮询获取结果吗?CompletionService快来了解下。
  2. linux mysql 类型_常用的MySQL数据类型
  3. ArcGIS Engine 中的多线程使用
  4. 带你读懂Spring Bean 的生命周期,嘿,就是玩儿~
  5. java uuid 效率_java uuid第一次性能
  6. 申万一级行业日指数_基金收评 | 指数震荡走弱,军工股成两市主线!后期行情如何?...
  7. 鸿蒙分布式通讯子系统,【鸿蒙】分布式通信子系统--让华为手机发现Hi3861开发板...
  8. 扩散(洛谷-P1661)
  9. 使用Faster_RCNN做文本检测
  10. 我的挨踢人物传之又是一年找工作时
  11. 4天卖断货3次!悄然登顶新书榜,这书绝对是四月最大黑马!
  12. 【图像隐写】基于matlab FRFT+SVD盲水印嵌入+攻击+提取【含Matlab源码 1757期】
  13. 网络类型NAT3改NAT1 基于(联通)光猫桥接、路由器红米AX5、win10系统
  14. Science:工具使用和语言句法在基底神经节共享计算机制和神经表征
  15. Java处理富文本编辑器的图片转为base64编码
  16. 【七里香】雨下整夜 我的爱溢出就像雨水
  17. 如何删除下一页分节符_页面布局里分节符添加的下一页空白页怎么删 - 卡饭网...
  18. 如果人类起源是一部编程史
  19. mod_wsgi和php,基于mod_wsgi模式安装Django
  20. Android 仿QQ 聊天消息拖拽效果

热门文章

  1. Java一行一行的读文件和简单的写文件
  2. python指定版本 安装模块包
  3. Educational Codeforces Round 56 Editorial
  4. TimeLine CSS/Javascript 时间线
  5. LoaderManager使用详解(三)---实现Loaders
  6. android利用WebView实现浏览器的封装
  7. HTTP_REFERER的获取情况
  8. python人工智能基础课免费_【领卡免费学】Python基础课(完整大课)
  9. 3690状态压缩+暴力
  10. POJ1422 最小路径覆盖