前言:最近看到一篇比较详细的描写C语言之const与define区别对的博文,经博主同意转发分享一哈
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/B3
那么c是多少呢?c=A/B3=A/A+33=1/1+33=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的作用非常强大,虽然它没有类型检测,不能调试,还要考虑边界效应,但是正因为没有类型检测,预编译是就完成,才使得它的使用更加灵活,功能更加强大。
作者:Love_Cpp_forever
原文:C语言之const与define区别