面试问题5:const 与 define 宏定义之间的区别

时间:2022-06-11 21:06:43

问题描述:const 与 define 宏定义之间的区别

(1) 编译器处理方式不同
     define宏是在预处理阶段展开;
     const常量是编译运行阶段使用;

(2) 类型和安全检查不同
     define宏没有类型,不做任何类型检查,仅仅是展开;
     const常量有具体的类型,在编译阶段会执行类型检查;

(3) 存储方式不同
     define宏仅仅是展开,有多少地方使用,就展开多少次,不会分配内存;
     const常量会在内存中分配(可以是堆中也可以是栈中);

利用宏的优点:

1)让代码更简洁明了

一般来说,宏的名字更要注重有明确直观的意义,有时宁可让它长点。

2)方便代码维护

对宏的处理,在编译过程中称为“预处理”。也就是说在正式编译前,编译器必须先将代码出现的宏,用其相应的宏值替换,这个过程有点你我在文字处理软件中的查找替换。所以在代码中使用宏表达常数,归根结底还是使用了立即数,并没有明确指定这个量的类型。

利用const:

常量定义的格式为:

const 数据类型 常量名 = 常量值;

而const定义的常量具有数据类型,定义数据类型的常量便于编译器进行数据检查,使程序可能出现错误进行排查。常量必须一开始就指定一个值,然后,在以后的代码中,我们不允许改变此常量的值。

define定义表达式时要注意“边缘效应”,例如如下定义:
#define N 2+3 //我们预想的N值是5,我们这样使用N,int a = N/2; //我们预想的a的值是2.5,可实际上a的值是3.5原因在于在预处理阶段,编译器将 a = N/2处理成了 a = 2+3/2;这就是宏定义的字符串替换的“边缘效应”因此要如下定义:#define N (2+3)

举例:

 #include <bits/stdc++.h>
#define N 2+3
using namespace std; int main()
{
double ans = N/2.0;
printf("%lf\n" ,ans );
}

GCC运行结果:

面试问题5:const 与 define 宏定义之间的区别