1、define在编译的预处理阶段起作用,将代码中的标识符替换成常量;而const在编译、运行期间都起作用。
2、#define宏定义不带类型,const是个关键字,需要定义常量的类型。
3、#define只进行简单的字符串替换,不能进行类型检查,而const有对应的数据类型,可以减少错误。例如:
```cpp
#define N 2+3 //我们预想的N值是5,我们这样使用N
double a = N/2; //我们预想的a的值是2.5,可实际上a的值是3.5
4、预处理后#define占用代码段空间,而const占用数据段空间。
5、const常量可以进行调试,而#define不能调试。
总的来说,const引入数据类型后,可以帮助编译器识别数据类型,这对编译器来说非常重要。而换个角度说,预处理就可以解决掉#define,而不避让编译器处理。
const相比#define的优点其实主要就两点,一是const有类型;二是const可以有不同的作用域。
此外,宏的主体是语言符号,它对于字符串的观点跟c/c++的字符串字面量是很不一样的,这会在使用中给程序员带来一些意想不到的问题。
const不足的地方,是与生俱来的,const不能重定义,而宏可以通过#undef取消某个符号的定义,再重新定义。