【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