【C++】一、const和#define的区别

本文探讨了C++中const关键字与宏定义define在类型检查、作用方式、编译处理、内存占用和功能限制等方面的对比,强调了const在避免错误和代码调试上的优势,并提到了两者在预编译和代码复用中的不同应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【C++】一、const和#define的区别

1、 类型检查

define – 无类型,不进行类型安全检查,可能会产生意想不到的错误,可能会导致边缘效应
const – 有数据类型,编译时会进行类型检查,可以避免一些低级的错误。如:

#include<iostream>
using namespace std;
#define N 2+3//我们预想的N值是5
//正确写法 #define N (2+3)

int main() {
	double a;
	a = (float)N / (float)2;
	cout << "a=" << a << endl; //我们预想的a的值是2.5,可实际上a的值是3.5, a = N/2处理成了 a = 2+3/2

	system("pause");
	return 0;
}

2、作用方式

define – 所给出的是一个立即数,预处理时只是简单的字符串替换,编译器只是把所定义的常量值与所定义的常量的名字联系起来。
const – 本质上还是该类型,占用空间大小与该数据类型大小相同。

3、编译器处理方式

define – 在预处理阶段进行替换。
const – 在编译时确定其值。

4、内存空间

define – 预处理后占用代码段空间,不分配内存,给出的是立即数,有多少次使用就进行多少次替换,在内存中会有多个拷贝,消耗内存大 。
const – 占用数据段空间,在静态存储区中分配空间,在程序运行过程中内存中只有一个拷贝。

5、 其他


define – 定义的常量是不可以用指针变量去指向的。
const – 定义的常量是可以用指针去指向该常量的地址的。


define – 可以定义一些简单的函数,如下。
const – 不可以定义函数。

#define <宏名>(<参数表>) <宏体>  
 
//定义S函数,使用S函数时,即为数字的自乘
#define S(num) (num)*(num)//括号避免边缘效应

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

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

⑤从某些特殊功能而言: define可以用来防止头文件重复引用,而const不能。如:

//主要把以下代码放在头文件中,可以防止头文件被重复引用

#ifndef xxx//如果没有定义xxx
#define xxx//定义xxx
//这里是你的代码
#endif //结束如果1234567

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

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


define – 宏定义的作用范围
const – 默认状态下,const对象只在文件内有效,当多个文件中出现了同名的const变量时,等同于在不同文件中分别定义了独立的变量。 如果想在多个文件之间共享const对象,必须在变量定义之前添加extern关键字(在声明和定义时都要加)。

来源参考:
链接1
链接2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值