C语言中宏定义宏名和宏值之间的关系

最近,我一直在看linux的内核源码程序,里面有大量的宏定义的情况,有时候又将宏名作为另外一个宏定义的宏值再次定义另外一个宏名,那么我就有一个疑问,c语言中宏的作用是什么,宏值和宏名两者之间有什么关系呢?这其实是2个问题。

问题一:宏的作用是什么?

大家都知道宏定义属于预处理语句的一种,而预处理语句是有编译工具链中的预处理器处理的,主要是将源文件文本中的宏值**"查找+全部替代"**的方式将源文件中的宏名使用宏值替代。有点像现在文本编辑器中使用查找快捷键"Ctrl+F"和替代"Ctrl+H",值得注意的是整个过程只是文字处理工作,不涉及到语法错误查找。也就是像word中使用查找快捷键"Ctrl+F"和替代"Ctrl+H"将工程中的每一个源文件中的内容进行了一次文字处理工作(我感觉这样比较非常贴切),之后后面编译器进行文本编译过程进行语法错误检查属于编译器的工作。

回答为什么要发明宏?

明白对宏的处理,我们就明白为什么要发明宏定义,发明宏名和宏值。

(1)使用宏的场景1:有时候代码中某一小段代码有特定含义,但是不足以形成一个函数,这个时候,就可以将这小段代码定义成一个宏,特定含义是宏名,这小段代码是宏值。这段代码如果涉及到变量这样定义的宏名带有一对小括号(),小括号中的为参数,形成了含参宏,含参宏在**"查找+全部替代"**时,还需要对参数进行替代。

(2)使用的宏的场景2:单独定义某个宏名,用于指导代码条件编译。如果定义了宏名,则代码段A会被编译,否则不被编译或者代码段B被编译。

(3)使用的宏的场景3:有些特定含义的常量,不容易记住,或者后面需要修改。这种场景最能体现宏的**"查找+全部替代"**属性,特定含义形成的文本为宏名,数字为宏值。这个单片机寄存器的相关操作中使用特别多,例如将寄存器的地址值这个我们人脑是记不住的,但是它有特定含义,因此就可以使用宏定义,我们在后面代码中就使用宏名了。

问题二:宏名和宏值之间的关系是什么?

首先,宏名是"语义化的",也就是具有特定含义的,有点"泛型"的,使用习惯使用英文大写单词加下划线描述成3个单词的文本(单词数量往往少于等于3个),符合人脑记忆的,容易记住的文本组合。宏名更倾向于人脑容易记住、容易理解的人类自然语言(英语)

宏值的特点往往是具体的,不容易记住的(过很长时间容易忘记的),常量化的,繁琐的代码片段, 宏值更适合被机器处理,因此宏值也是属于C语言高级语言,但是宏值更加适合或者更加容易,更加倾向于被机器处理,因此它表现出来的"语义型"往往不如前面的宏名。

举个例子:#define NAME "xiaming"

宏名NAME和宏值"xiaoming"相比,宏名更加具有语义性、抽象性,概括性,因为宏名NAME更容易被大脑记住,时间长了也不会忘记;而宏值"xiaming"具有具体含义(表现为具体型),属于特定字符串,时间长了不容易被大脑记住(时间长了谁还记得具体名字是什么),更倾向于被机器处理。

总之:宏名是倾向于被人脑处理的代码片段,宏值是倾向于被机器处理对的代码片段;宏名具有人类语义型、抽象性、概括性,宏值具有机器思维性、具体性、常量性、片段性。

但是,一定要记住的是宏名和宏值都是c语言高级语言的代码片段。C语言高级语言写出的函数更倾向于人脑的思维(业务逻辑,干什么事情,完成什么工作),因此它内部函数体使用或者处理宏名更加合适,毕竟宏名也更倾向于人脑记忆特性,因此在函数中尽量多的将一些代码段、常量等定义为特定符合人脑思维记忆理解的宏值(文本单词)是特别有意义的。因为,如果函数中有大量强项于机器处理的常量、代码段等宏值,这样交叉这人脑思维和机器思维,增加了函数理解难度和复杂度。

总之,一句话:函数写出了是给人看到,需要让人理解起来更容易,因此尽量多的将数字机器的宏值替代(或编码)为人脑语义的宏名是非常有必要的

写代码过程是将数字机器的宏值替代(或编码)为人脑语义的宏名的过程,预处理器预处理的过程是人脑语义的宏名替代(还原)为数字机器宏值的过程。

相关推荐
a4493153625 小时前
MacBook USB-C不充电故障诊断:从PD握手到主板供电链路
c语言·开发语言·macos·电脑
a4493153626 小时前
iPhone 充电故障的全链路诊断——从 Lightning/USB-C 接口到 Tristar 充电 IC
c语言·macos·ios·电脑·硬件架构·iphone
qq_448011166 小时前
C语言中的getchar()
c语言·开发语言
天空'之城6 小时前
C 语言工业级通用组件手写 15:累加和校验
c语言·嵌入式开发·工业级组件·累加和校验
碎光拾影21 小时前
i.MX6ULL时钟系统配置指南
c语言·arm开发·嵌入式硬件
GeekArch21 小时前
第28讲:避坑——AI堆栈分配错误、栈溢出BUG
c语言·人工智能·stm32·mcu·学习·bug
wuyk5551 天前
59.嵌入式C语言高级宏定义实战:多行宏、字符串化与符号拼接
c语言·开发语言·stm32·单片机·嵌入式硬件·物联网·51单片机
无相求码1 天前
C程序的内存到底怎么分的?栈、堆、全局区一张图讲清楚
c语言
天空'之城1 天前
C 语言工业级通用组件手写 08:精准软件消抖
c语言·嵌入式开发·工业级组件·软件消抖·按键防抖