首页 > 编程知识 正文

const和define的含义,const代替define

时间:2023-05-06 14:35:23 阅读:183087 作者:2504

define 与const 
符号变量define是预编译指令,在预编译的时候仅仅进行字符替换,预编译后符号常量就不存在了,例如define PI 3.1415926 ,编译以后就不存在PI了,所有的PI都被换成了3.1415926。而且PI没有存储单元。而常变量const变量要占用存储单元,有变量值,只是值不能改,它有符号变量的优点,而且比较方便。其实还有一个static,不过这是C语言,就不说它了。
具体可以分为:
(1)const定义的常数带类型,define不带类型,
(2)const是在 编译、运行的时候起作用,而define是在编译的预处理阶段起作用。 
(3)define只是简单的字符串替换,没有类型检查。而const有对应的数据类型,是要进行判断的,可以避免一些低级的错误。 
define只是简单的字符串替换会导致边界效应,比如定义
                #define A 1
                #define B A+3
                #define C A/B*3
那么c是多少呢?c=A/B*3=A/A+3*3=1/1+3*3=10;
所以这种用的时候可以直接都用个括号括起来,就不怕边界效应了。
(4)define预处理后占用代码空间,而const占用数据段空间。 
(5) const常量可以进行调试的,define是不能进行调试的,主要是预编译阶段就已经替换掉了,调试的时候就没它了。
(6)const不能重定义,不可以定义两个一样的,而define就比较牛气了,它通过undef取消某个符号的定义,再重新定义。
(7) define可以用来防止头文件重复引用,而const不能。举例:


#ifndef GRAPHICS_H // 防止graphics.h被重复引用 
#define GRAPHICS_H
……代码…… 
#endif


这里要说一下有些头文件重复引用只是增加了编译工作的工作量,不会引起太大的问题,仅仅是编译效率低一些,但是对于大工程而言编译效率低下那将是一件多么痛苦的事情;有些头文件重复包含,会引起错误,比如在头文件中定义了全局变量这种会引起重复定义
,虽然C规范允许,但是不推荐这样用啊。


(8)使用define会使得代码看起来非常简单,而const无法实现该功能 
例如,MFC在实现六大核心机制中,大量使用了define 
1、MFC程序的初始化 
2、运行时类型识别(RTTI) 
3、动态创建 
4、永久保存 
5、消息映射 
6、消息传递
define和const直接的区别在某个点上同C语言与JAVA语言有一定的相似性: 
(1) JAVA中内部对象高度封装,比如对于内存的回收机制而言更是自动完成,不需要程序员多费心;而C语言中,每次我们用指针申请一段空间时,我们都需要仔细考虑,这个指针后面会不会还要使用,现在是不是可以释放了,会不会成为野指针等等问题,所有的内存相关问题都需要程序员自己考虑,但是好处是,C语言可以直接方便的操作内存,这是一把双刃剑,用得好事半功倍,用得不好,内存泄漏,指针跑飞,问题到处都是。
(2) C语言和JAVA语言的差异点类比到define和const,要强调的是define的作用非常强大,虽然它没有类型检测,不能调试,还要考虑边界效应,但是正因为没有类型检测,预编译是就完成,才使得它的使用更加灵活,功能更加强大。
话说看着别人的学的怎么选类型,转载好像不是,也不是原创,更不是翻译,就不能来个其他么?

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。