const与#define的区别、优点

const与#define的区别

编译器处理方式不同

define宏是在预处理阶段展开。

补充:预处理器根据以#开头的命令,修改原始的程序。比如我们常见的#include <stdio.h>命令告诉处理器读取系统头文件stdio.h的内容,并把它直接插入程序文本中。咱们的#define也是,仅仅是单纯的文本替换。

const常量是编译运行阶段使用。

类型和安全检查不同

define宏没有数据类型,不做任何类型检查,仅仅是展开。

const常量有具体的数据类型,在编译阶段会执行类型检查。

存储方式不同

define宏仅仅是展开,有多少地方使用,就展开多少次,不会分配内存。

const常量会在内存中分配(可以是堆中也可以是栈中)。

const  可以节省空间,避免不必要的内存分配。

例如:

#define PI 3.14159 //常量宏  
const doulbe Pi=3.14159; //此时并未将Pi放入ROM中
double i=Pi; //此时为Pi分配内存,以后不再分配!  
double I=PI; //编译期间进行宏替换,分配内存  
double j=Pi; //没有内存分配  
double J=PI; //再进行宏替换,又一次分配内存!  

const定义常量从汇编的角度来看,只是给出了对应的内存地址,而不是象#define一样给出的是立即数,所以,const定义的常量在程序运行过程中只有一份拷贝,而 #define定义的常量在内存中有若干个拷贝。

代码调试不同

const常量可以进行调试的。

define是不能进行调试的,因为在预编译阶段就已经替换掉了。

const优点

const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误。

有些集成化的调试工具可以对const常量进行调试,但是不能对宏常量进行调试。

const可节省空间,避免不必要的内存分配,提高效率。

#define的优点

宏可以定义一些函数,const不可以

宏可以使代更码简洁

使用宏可以方便代码维护

宏还可以定义带参数的宏,做到一定程度的泛型(利用#或者##操作符)

posted @ 2019-08-30 12:55  WindSun  阅读(1260)  评论(1编辑  收藏  举报
博客已停更,文章已转移,点击访问