#define和const的区别

这个区别用从几个角度来说:

角度1:
就定义常量说的话:
const 定义的常数是变量 也带类型, #define 定义的只是个常数 不带类型。

角度2:
就起作用的阶段而言:
define是在编译的预处理阶段起作用,而const是在 编译、运行的时候起作用。

角度3:
就起作用的方式而言:
define只是简单的字符串替换,没有类型检查。而const有对应的数据类型,是要进行判断的,可以避免一些低级的错误。
正因为define只是简单的字符串替换会导致边界效应,具体举例可以参考下面代码:

#define N 2+3 //我们预想的N值是5,我们这样使用N
double a = N/2;  //我们预想的a的值是2.5,可实际上a的值是3.0

角度4:
就空间占用而言:
例如:

#define PI 3.14     //预处理后 占用代码段空间
const float PI=3.14;    //本质上还是一个 float,占用数据段空间

角度5:
从代码调试的方便程度而言:
const常量可以进行调试的,define是不能进行调试的,因为在预编译阶段就已经替换掉了

角度6:
从是否可以再定义的角度而言:
const不足的地方,是与生俱来的,const不能重定义,而#define可以通过#undef取消某个符号的定义,再重新定义。

角度7:
从某些特殊功能而言:
define可以用来防止头文件重复引用,而const不能,可以参看下面代码:

//主要把以下代码放在头文件中,可以防止头文件被重复引用
#ifndef xxx//如果没有定义xxx
#define xxx//定义xxx

//这里是你的代码

#endif //结束如果

PS: 下面说一下,头文件被重复引用的弊端:
(1) 有些头文件重复引用只是增加了编译工作的工作量,不会引起太大的问题,仅仅是编译效率低一些,但是对于大工程而言编译效率低下那将是一件多么痛苦的事情。
(2) 有些头文件重复包含,会引起错误,比如在头文件中定义了全局变量(虽然这种方式不被推荐,但确实是C规范允许的)这种会引起重复定义。

角度8:
从某些复杂功能的实现的实现角度来看:
使用define会使得代码看起来非常简单,而const无法实现该功能
例如,MFC在实现六大核心机制中,大量使用了define
1、MFC程序的初始化
2、运行时类型识别(RTTI)
3、动态创建
4、永久保存
5、消息映射
6、消息传递

比如,在实现RTTI功能的时候,定义了如下宏,代码如下:

#define DECLARE_DYNCREATE(class_name) \

    DECLARE_DYNAMIC(class_name)\

    static CObject* PASCALCreateObject();

最后做一下小结:
从上面的各个角度,我们可以看到define和const直接的区别在某个点上同C语言与JAVA语言有一定的相似性,之所以这么说,原因如下:
(1) JAVA中内部对象高度封装,比如对于内存的回收机制而言更是自动完成,不需要程序员多费心;而C语言中,每次我们用指针申请一段空间时,我们都需要仔细考虑,这个指针后面会不会还要使用,现在是不是可以释放了,会不会成为野指针等等问题,所有的内存相关问题都需要程序员自己考虑,但是好处是,C语言可以直接方便的操作内存,这是一把双刃剑,用得好事半功倍,用得不好,内存泄漏,指针跑飞,问题到处都是,就算抓到了dump,用windbg也不好分析(特别是跨模块的情况)
(2) C语言和JAVA语言的差异点类比到define和const,我这里只是想强调define的作用非常强大,虽然它没有类型检测,不能调试,还要考虑边界效应,但是正因为没有类型检测,预编译是就完成,才使得它的使用更加灵活,功能更加强大,如果我们可以善用define,往往可以发挥到意想不到的效果。

  • 156
    点赞
  • 492
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
### 回答1: constdefine区别是,const 是 C 和 C++ 编程语言中的一种用于声明常量的关键字,它指定变量的值在声明之后不能更改。而 define 则是 C 和 C++ 的预处理指令,用于定义常量和宏。 ### 回答2: constdefine是两种常量定义的方式。 首先,const是一种在C++中定义常量的方式。它用于声明一个不可修改的变量,其值无法再被改变。通过使用const关键字,我们可以给一个变量赋值,并表示它在整个程序中是不变的。例如,我们可以使用const来定义一个常量pi,如下所示: const float pi = 3.14159; 在整个程序执行过程中,pi的值都是不可改变的。 而define是一种在C/C++中定义宏的方式。它是一种在预处理阶段进行文本替换的机制,通过使用预处理指令#define,我们可以给一个标识符定义一个替换字符串。例如,我们可以使用define定义一个常量pi,如下所示: #define pi 3.14159 在编译过程中,所有出现pi的地方都会被替换为3.14159。 相比之下,const的常量定义更加安全和可读性更高。const定义的常量有作用域和类型,可以进行类型检查和编译器优化,而define定义的常量只是简单的文本替换,没有作用域和类型,容易引起错误。此外,const定义的常量还可以在运行时进行调试和修改,而define定义的常量是无法进行调试和修改的。 总的来说,const是一种更加推荐的常量定义方式,它具有类型检查、作用域和可读性等优势,而define则是一种更加简单和原始的文本替换方式。 ### 回答3: constdefine是两种常用的定义常量的方法,它们在功能和使用方式上有一些区别。 首先,constC++中的一个关键字,用于定义常量。定义一个const常量时,需要指定具体的数据类型,并且必须进行初始化赋值,之后不能再修改其值。而defineC语言中的一个预处理器指令,用于定义宏常量。define不需指定数据类型,只是进行简单的文本替换。 其次,const常量在编译期间进行类型检查,可以避免一些潜在的类型错误,提高了代码的可读性和可维护性。而define宏常量只是进行简单的文本替换,不会进行类型检查,容易因为忽略了预处理的文本替换导致错误。 此外,const常量有作用域的概念,只在其定义的作用域内有效,可以避免命名冲突。而define宏常量没有作用域的概念,会把所有的文本替换都应用到源代码中。 最后,const常量可以进行调试和跟踪,可以在编译器中查看和修改其值。而define宏常量则不具备这样的特性,因为它只是简单的文本替换,没有实际的存储空间。 总之,constdefine在功能和使用方式上有一些区别constC++中定义常量的关键字,具有类型检查、作用域、调试和跟踪等特性;而defineC语言中的预处理器指令,只是进行简单的文本替换,没有类型检查、作用域和调试特性。我们可以根据实际需求选择使用适合的方式来定义常量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值