问题描述:const 与 define 宏定义之间的区别
(1) 编译器处理方式不同
define宏是在预处理阶段展开;
const常量是编译运行阶段使用;
(2) 类型和安全检查不同
define宏没有类型,不做任何类型检查,仅仅是展开;
const常量有具体的类型,在编译阶段会执行类型检查;
(3) 存储方式不同
define宏仅仅是展开,有多少地方使用,就展开多少次,不会分配内存;
const常量会在内存中分配(可以是堆中也可以是栈中);
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)
举例:
1 #include <bits/stdc++.h> 2 #define N 2+3 3 using namespace std; 4 5 int main() 6 { 7 double ans = N/2.0; 8 printf("%lf " ,ans ); 9 }
GCC运行结果: