VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 1119|回复: 0

[转载] 常变量和宏定义的区别

[复制链接]
46_avatar_middle
最佳答案
0 
在线会员 发表于 2022-4-21 19:26:39 | 显示全部楼层 |阅读模式
1.效果-《⾼质量C++/C编程指南》
C++ 语⾔可以⽤const 来定义常量,也可以⽤#define 来定义常量。但是前者⽐后者有更多的优点:
(1) const 常量有数据类型,⽽宏常量没有数据类型。编译器可以对前者进⾏类型安全检查。⽽对后者只进⾏字符替换,没有类型安全检
查,并且在字符替换可能会产⽣意料不到的错误(边际效应)。
(2)有些集成化的调试⼯具可以对const 常量进⾏调试,但是不能对宏常量进⾏调试。规则5-2-1:在C++ 程序中只使⽤const 常量⽽不使
⽤宏常量,即const 常量完全取代宏常量。
2.实现机制
宏是预处理命令,即在预编译阶段进⾏字节替换。const常量是变量,在执⾏时const定义的只读变量在程序运⾏过程中只有⼀份拷贝(因为
它是全局的只读变量,存放在静态存储区的只读数据区。根据c/c++语法,当你声明该量为常量,即告诉程序和编译器,你不希望此量被修
改。程序的实现,为了保护常量,特将常量都放在受保护的静态存储区内。凡是试图修改这个区域内的值,都将被视为⾮法,并报错。这
不能理解为凡是字符串都是放在静态存储区域的。这个跟数据类型没有关系,⽽是这个量是变量还是常量的问题。例如,⼀个字符串变量就
是可以被修改的。这种静态存储区域的保护机制是由编译器实现的,⽽⾮存储该值的内存的电器属性。换⾔之,实质上内存永远都可以被⽤
户随意修改,只是编译器给⽤户的代码注⼊了⼀些⾃⼰的保护代码,通过软件⼿段将这段内存软保护起来。这种保护在汇编级别可以轻松突
破,其保护也就⽆效了。)。
3.⽤法区别
define宏定义和const常变量区别:
1.define是宏定义,程序在预处理阶段将⽤define定义的内容进⾏了替换。因此程序运⾏时,常量表中并没有⽤define定义的常量,系统不为
它分配内存。const定义的常量,在程序运⾏时在常量表中,系统为它分配内存。
2.define定义的常量,预处理时只是直接进⾏了替换。所以编译时不能进⾏数据类型检验。const定义的常量,在编译时进⾏严格的类型检
验,可以避免出错。3.define定义表达式时要注意“边缘效应”,例如如下定义:
#define N 2+3 //我们预想的N值是5,我们这样使⽤N,int a = N/2; //我们预想的a的值是2.5,可实际上a的值是3.5原因在于在预处理阶段,
编译器将 a = N/2处理成了 a = 2+3/2;这就是宏定义的字符串替换的“边缘效应”因此要如下定义:#define N (2+3)。const定义表达式没有上
述问题。const定义的常量叫做常变量原因有⼆:const定义常量像变量⼀样检查类型;const可以在任何地⽅定义常量,编译器对它的处理过
程与变量相似,只是分配内存的地⽅不同。




上一篇:学习结构体应用
下一篇:MFC中怎么把一个工程中的对话框复制到另一个工程
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号-4 )|网站地图wx_jqr

GMT+8, 2023-12-10 09:19

Powered by CcTry.CoM

© 2009-2021 cctry.com

快速回复 返回顶部 返回列表