const(常量)和#define(宏定义)区别
编译器处理不同
宏定义是一个“编译时”概念,在预处理阶段展开(在编译时把所有用到宏定义值的地方用宏定义常量替换),不能对宏定义进行调试,生命周期结束于编译时期;
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(宏定义)区别相关推荐
- const常量与define宏定义的区别
#define RADIUS 100; const float RADIUS = 100; (1) 编译器处理方式不同 define宏是在预处理阶段展开. const常量是编译运行阶段使用. ( ...
- C语言基础知识之define宏定义表达式,undef,内存对齐,a和a的区别,数组知识点,int (*)[10] p,二维数组参数与二维指针参数,函数指针数组,常见的内存错误及对策
一.用define宏定义表达式 1.定义一年有多少秒: #define SEC_A_YEAR 60*60*24*365 //上述描述不可靠,没有考虑到在16位系统下把这样一个数赋给整型变量的时候可能会 ...
- #define宏定义是什么?怎么写?一文搞懂。
前言 第一次接触宏定义的时候,是在学校的C++课程大作业中.当时有幸看到了大佬写的源码,里面有很多的宏定义.当时并不了解宏定义的妙用,只感觉它像是定义了一个变量一样,不好理解还有些多此一举. 这之后在 ...
- typedef与宏定义区别
typedef与宏定义区别 个人觉得这篇文章写得非常好,就转了.我转载的这篇文章的地址为http://i.mtime.com/ocgcyj/blog/5693781/. 陷阱一: 记住,typedef ...
- 枚举enum与#define 宏的区别?
枚举enum与#define 宏的区别? 1)#define 宏常量是在预编译阶段进行简单替换.枚举常量则是在编译的时候确定其值. 2)一般在编译器里,可以调试枚举常量,但是不能调试宏常量. 3)枚举 ...
- define宏定义中的#,##,@#及\符号
define宏定义中的#,##,@#及\符号 在#define中,标准只定义了#和##两种操作.#用来把参数转换成字符串,##则用来连接两个前后两个参数,把它们变成一个字符串. 1.# (string ...
- 关于C语言刷题(#define宏定义函数的常见错误)
关于C语言刷题(#define宏定义函数的常见错误) 首先我们来先看对#define的定义 define,宏定义,C语言中预处理命令一种.分为无参宏定义和带参宏定义.无参宏定义的一般形式为:#defi ...
- define宏定义和const定义之间的区别
define部分: 宏不仅可以用来代替常数值,还可以用来代替表达式,甚至是代码段.(宏的功能很强大,但也容易出错,所以其利弊大小颇有争议.) 宏的语法为: #define 宏名称 宏值 注意,宏定义不 ...
- const与#define宏定义的区别——C语言深度剖析
const定义的只读变量在程序运行过程中只有一份拷贝(因为它是全局的只读变量,存放在静态区),而#define定义的宏常量在内存中有若干个拷贝. #define宏是在预编译阶段进行替换,而const修 ...
- 关于C语言define宏定义字符串常量
1.问题由来: 本人一直以为宏对于字符串的处理也是直接在预处理时进行替换:但是最近在工作中遇到了字符串宏+1的情况:于是彻底的颠覆了以前的思维:于是乎进行测试验证得出以下结果. 2.测试代码 /*测试 ...
最新文章
- 还在使用Future轮询获取结果吗?CompletionService快来了解下。
- linux mysql 类型_常用的MySQL数据类型
- ArcGIS Engine 中的多线程使用
- 带你读懂Spring Bean 的生命周期,嘿,就是玩儿~
- java uuid 效率_java uuid第一次性能
- 申万一级行业日指数_基金收评 | 指数震荡走弱,军工股成两市主线!后期行情如何?...
- 鸿蒙分布式通讯子系统,【鸿蒙】分布式通信子系统--让华为手机发现Hi3861开发板...
- 扩散(洛谷-P1661)
- 使用Faster_RCNN做文本检测
- 我的挨踢人物传之又是一年找工作时
- 4天卖断货3次!悄然登顶新书榜,这书绝对是四月最大黑马!
- 【图像隐写】基于matlab FRFT+SVD盲水印嵌入+攻击+提取【含Matlab源码 1757期】
- 网络类型NAT3改NAT1 基于(联通)光猫桥接、路由器红米AX5、win10系统
- Science:工具使用和语言句法在基底神经节共享计算机制和神经表征
- Java处理富文本编辑器的图片转为base64编码
- 【七里香】雨下整夜 我的爱溢出就像雨水
- 如何删除下一页分节符_页面布局里分节符添加的下一页空白页怎么删 - 卡饭网...
- 如果人类起源是一部编程史
- mod_wsgi和php,基于mod_wsgi模式安装Django
- Android 仿QQ 聊天消息拖拽效果