const 与 #define的区别

本文深入探讨了C++中的宏(define)与const常量的区别,包括编译器处理方式、类型和安全检查、存储方式等方面,并通过对比分析了两者在程序设计中的适用场景与优缺点。

由于笔试面试中常常被问及这两者之间的区别,在此作一个简单的总结和扩充。


在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.youkuaiyun.com/weiwenhp/article/details/8476767

http://blog.chinaunix.net/uid-22330495-id-200907.html

http://wenku.baidu.com/link?url=L08vixs7D77pVgju10bqSxIYdpaT9D7kdQtWsTn9mmBJGOdyVhew_VpxdomkzIUYz00-E4ULcXeMTYQZOJnZAlE8JUJnAj5T-0x1HqMd2mm


`const` `#define` 在C/C++ 编程中有诸多区别,以下从多个方面进行阐述: 1. **执行时间内存分配**:`#define` 在预编译阶段把符号常量替换成对应的值,不分配内存。`const` 在编译阶段分配内存,并将对应的值存进常变量之中。例如: ```c #define PI 3.14159 const double pi = 3.14159; ``` 这里 `#define` 的 `PI` 只是简单替换,无内存分配;`const` 的 `pi` 会在编译时分配内存 [^2]。 2. **数据类型**:`#define` 定义的符号常量没有类型,编译器只做简单替换,不检查内容。`const` 定义的常变量具有类型,编译器在编译时会进行类型安全检查。例如: ```c #define NUM 10 const int num = 10; ``` 编译器不会对 `NUM` 做类型检查,但会对 `num` 进行类型检查 [^2]。 3. **作用域**:`#define` 的作用域是从定义处到程序结束,可通过 `#undef` 取消。`const` 的作用域遵循一般变量的作用域规则。例如: ```c #define MAX 100 void func() { const int localMax = 200; // localMax 只在 func 函数内有效 } // MAX 在此处仍有效 ``` 4. **调试便利性**:`const` 常量可以进行调试,`define` 调试困难,因为在预编译阶段就被替换掉了 [^3]。 5. **编译器处理方式**:编译器对 `const` 常量 `#define` 宏的处理方式不同。`const` 常量在编译时被编译器作为一个变量处理;`#define` 只是简单的文本替换 [^1]。 6. **内存使用**:`const` 可以节省空间,避免不必要的内存分配。如: ```c #define PI 3.14159 const double Pi = 3.14159; double i = Pi; // 此时为 Pi 分配内存,以后不再分配 double I = PI; // 编译期间进行宏替换,分配内存 double j = Pi; // 没有内存分配 double J = PI; // 再进行宏替换,又一次分配内存 ``` 说明 `const` 定义的常量在首次使用时分配内存,后续使用不再分配;`#define` 每次替换都会涉及内存分配 [^4]。 7. **可重定义性**:`const` 不能重定义,`#define` 可以通过 `#undef` 取消某个符号的定义,再重新定义 [^3]。 8. **表达式处理**:宏替换只作替换,不做计算表达式求解;`const` 定义的常量可进行正常的表达式计算 [^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值