C语言中的 const 与 #define

本文探讨了C语言中的const关键字和#define预处理指令。const用于创建不可变的常量,常量在静态存储区,而#define通过文本替换实现常量,可能在内存占用和安全性上有差异。const只能修饰变量,而#define可作为小型函数的替代,但不考虑数据类型。const在数组声明中受限,而#define则适用。合理使用#define的括号以避免宏展开问题,并解析了const修饰指针的规则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

近期看到一篇文章,是讲解 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 的一些理解的阐述,不足及错误之处还请各位多多批评。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值