近期看到一篇文章,是讲解 C 中 const 与 #define 的,读完后挺有感触。遂结合自己的一些理解,对其做一下总结。
- const:
const 是 C语言的一个关键字,被其修饰的变量将不能被改动,即成为一个常量。
由于被 const 修饰的对象不能被改变,所以只能通过初始化的方式对对象设定值。
一般情况下,我们为了防止对象或函数所使用的参数被意外修改,而将该对象或参数通过 const 修饰以变为常量使用。养成善用 const 的习惯可以使程序更易于维护、更加的安全。
- #define:
#define 是一条预处理指令,由预处理器来执行,所以严格来说 #define 不属于 C语言指令。
功能方面,#define 和 const 一样用于建立常量。
优点方面,#define 能起到简化代码,使程序易于维护、更加安全的作用。
const 与 #define 的不同:
实现方面,const 定义的常量被分配到程序的静态储存区内,试图修改它的操作会被视为非法。而 #define 是在预处理阶段由文本替换实现的,这意味结果仅仅是将C源文件中的所有“define”过的文本替换为“define”的内容,所以可能最终的内容不是你想要的。另外,const 定义的常量在程序运行中只有一份拷贝,而 #define 替换了几处就有多少份拷贝,因此,#define 所占用的内存资源也比 const 多的多。
功能方面,const 只能修饰某个变量,而 #define 可以当做一个函数使用。一般我们将小型的函数定义为宏,这样在预处理时,该函数将直接被插入到调用它的位置直接使用,效率比调用函数要高。但是,由于 #define 是直接进行文本替换,所以在定义常量时无所谓数据类型,而 const 是有数据类型的。
一些细节和注意点:
-
如上所说,#define 是在编译前的预处理阶段实现的,这也就说明了为什么 #define 定义的常量可以用于数组声明而 const 定义的常量则不可以。因为数组的大小必须在编译时确定,#define 在编译前已将数组的维度替换为常量了,所以在编译时符合已知数组大小的要求,而 const 只在用其时分配内存,也就是说在数组声明时,const 常量还是未知的!
-
使用 #define 时,合理使用括号(即用括号把一切里三层外三层的括起来),以防止宏展开后的尴尬局面。
-
类似于 const int * const ptr 的解读。采用自左向右的顺序,即 const 修饰的是紧接其右边的对象。第一个 const 右边为 int,int 为一个变量,所以此意味着 ptr 所指的变量不可修改。第二个 const 右边是 ptr,其修饰的是指针,即该指针指向的地址不可更改。
以上是我对 const 于 #define 的一些理解的阐述,不足及错误之处还请各位多多批评。