由于笔试面试中常常被问及这两者之间的区别,在此作一个简单的总结和扩充。
在C语言中:
#define用来定义宏,用宏来代替常量(包括无参量、有参量);
typedef用来为类型标示符定义别名,以便增加可读性;
到了C++中:
const、enum、inline、引用也都成为了定义别名的工具。
其中#define与const的区别主要如下:
在C++中不推荐用宏,尽量少用。因为C++是强类型的语言,希望通过类型检查来降低程序中的很多错误,而宏只是在编译期前做简单替换,绕过了类型检查,失去了强类型系统的优势支撑。
(1) 编译器处理方式不同
define宏是在预处理阶段展开。
const常量是编译运行阶段使用。
(2) 类型和安全检查不同
define宏没有类型,不做任何类型检查,仅仅是展开。
const常量有具体的类型,在编译阶段会执行类型检查。
(3) 存储方式不同
define宏仅仅是展开,有多少地方使用,就展开多少次,不会分配内存。
const常量会在内存中分配(可以是堆中也可以是栈中)。
(4) const 可以节省空间,避免不必要的内存分配。 例如:
const定义常量从汇编的角度来看,只是给出了对应的内存地址,而不是象#define一样给出的是立即数,所以,const定义的常量在程序运行过程中只有一份拷贝,而 #define定义的常量在内存中有若干个拷贝。
参考:
http://blog.sina.com.cn/s/blog_79b01f6601018xdg.html
http://blog.csdn.net/weiwenhp/article/details/8476767
http://blog.chinaunix.net/uid-22330495-id-200907.html
http://wenku.baidu.com/link?url=L08vixs7D77pVgju10bqSxIYdpaT9D7kdQtWsTn9mmBJGOdyVhew_VpxdomkzIUYz00-E4ULcXeMTYQZOJnZAlE8JUJnAj5T-0x1HqMd2mm