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

📅 2026/7/19 23:25:40
C语言中宏定义宏名和宏值之间的关系
最近我一直在看linux的内核源码程序里面有大量的宏定义的情况有时候又将宏名作为另外一个宏定义的宏值再次定义另外一个宏名那么我就有一个疑问c语言中宏的作用是什么宏值和宏名两者之间有什么关系呢这其实是2个问题。问题一宏的作用是什么大家都知道宏定义属于预处理语句的一种而预处理语句是有编译工具链中的预处理器处理的主要是将源文件文本中的宏值“查找全部替代”的方式将源文件中的宏名使用宏值替代。有点像现在文本编辑器中使用查找快捷键“CtrlF”和替代“CtrlH”值得注意的是整个过程只是文字处理工作不涉及到语法错误查找。也就是像word中使用查找快捷键“CtrlF”和替代“CtrlH”将工程中的每一个源文件中的内容进行了一次文字处理工作我感觉这样比较非常贴切之后后面编译器进行文本编译过程进行语法错误检查属于编译器的工作。回答为什么要发明宏明白对宏的处理我们就明白为什么要发明宏定义发明宏名和宏值。1使用宏的场景1有时候代码中某一小段代码有特定含义但是不足以形成一个函数这个时候就可以将这小段代码定义成一个宏特定含义是宏名这小段代码是宏值。这段代码如果涉及到变量这样定义的宏名带有一对小括号()小括号中的为参数形成了含参宏含参宏在“查找全部替代”时还需要对参数进行替代。2使用的宏的场景2单独定义某个宏名用于指导代码条件编译。如果定义了宏名则代码段A会被编译否则不被编译或者代码段B被编译。3使用的宏的场景3有些特定含义的常量不容易记住或者后面需要修改。这种场景最能体现宏的“查找全部替代”属性特定含义形成的文本为宏名数字为宏值。这个单片机寄存器的相关操作中使用特别多例如将寄存器的地址值这个我们人脑是记不住的但是它有特定含义因此就可以使用宏定义我们在后面代码中就使用宏名了。问题二宏名和宏值之间的关系是什么首先宏名是“语义化的”也就是具有特定含义的有点“泛型”的使用习惯使用英文大写单词加下划线描述成3个单词的文本单词数量往往少于等于3个符合人脑记忆的容易记住的文本组合。宏名更倾向于人脑容易记住、容易理解的人类自然语言英语宏值的特点往往是具体的不容易记住的过很长时间容易忘记的常量化的繁琐的代码片段宏值更适合被机器处理因此宏值也是属于C语言高级语言但是宏值更加适合或者更加容易更加倾向于被机器处理因此它表现出来的“语义型”往往不如前面的宏名。举个例子#define NAME “xiaming”宏名NAME和宏值“xiaoming”相比宏名更加具有语义性、抽象性概括性因为宏名NAME更容易被大脑记住时间长了也不会忘记而宏值“xiaming”具有具体含义表现为具体型属于特定字符串时间长了不容易被大脑记住时间长了谁还记得具体名字是什么更倾向于被机器处理。总之宏名是倾向于被人脑处理的代码片段宏值是倾向于被机器处理对的代码片段宏名具有人类语义型、抽象性、概括性宏值具有机器思维性、具体性、常量性、片段性。但是一定要记住的是宏名和宏值都是c语言高级语言的代码片段。C语言高级语言写出的函数更倾向于人脑的思维业务逻辑干什么事情完成什么工作因此它内部函数体使用或者处理宏名更加合适毕竟宏名也更倾向于人脑记忆特性因此在函数中尽量多的将一些代码段、常量等定义为特定符合人脑思维记忆理解的宏值文本单词是特别有意义的。因为如果函数中有大量强项于机器处理的常量、代码段等宏值这样交叉这人脑思维和机器思维增加了函数理解难度和复杂度。总之一句话函数写出了是给人看到需要让人理解起来更容易因此尽量多的将数字机器的宏值替代或编码为人脑语义的宏名是非常有必要的。写代码过程是将数字机器的宏值替代或编码为人脑语义的宏名的过程预处理器预处理的过程是人脑语义的宏名替代还原为数字机器宏值的过程。