尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
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语言高级语言写出的函数更倾向于人脑的思维业务逻辑干什么事情完成什么工作因此它内部函数体使用或者处理宏名更加合适毕竟宏名也更倾向于人脑记忆特性因此在函数中尽量多的将一些代码段、常量等定义为特定符合人脑思维记忆理解的宏值文本单词是特别有意义的。因为如果函数中有大量强项于机器处理的常量、代码段等宏值这样交叉这人脑思维和机器思维增加了函数理解难度和复杂度。总之一句话函数写出了是给人看到需要让人理解起来更容易因此尽量多的将数字机器的宏值替代或编码为人脑语义的宏名是非常有必要的。写代码过程是将数字机器的宏值替代或编码为人脑语义的宏名的过程预处理器预处理的过程是人脑语义的宏名替代还原为数字机器宏值的过程。
RELATED

相关推荐

【JVM调优实战】33-案例-容器化环境JVM内存陷阱

【JVM调优实战】33-案例-容器化环境JVM内存陷阱

案例:容器化(K8s)环境的 JVM 内存陷阱 本文是《JVM调优实战》专栏第 33 讲。 引言 把 JVM 应用从虚拟机搬到 Kubernetes,就像让一个习惯住大房子的人搬进精装修公寓。虚拟机时代,JVM 看到的是整台物理机的内存,想用多少用多少;而容器时代,Pod 被 resources.limits.mem…

📅 2026/9/11 18:27:05
2026香港EMBA性价比榜单:创业资源丰富的香港EMBA,民企老板择校避坑测评

2026香港EMBA性价比榜单:创业资源丰富的香港EMBA,民企老板择校避坑测评

【客观测评声明】本文为独立商科教育测评内容,无硬性广告植入,基于2026年各院校公开官方数据,从民企创始人、科创企业高管真实需求出发,客观拆解各香港EMBA项目适配度、性价比及短板,为企业家择校提供真实参考。 不少…

📅 2026/9/8 8:16:56
无人值守安装与中文本土化配置总结

无人值守安装与中文本土化配置总结

无人值守安装与中文本土化配置总结 概述 本文档总结 ReactOS 无人值守(Unattended)安装机制的完整流程,以及中文本地化(SimSun 字体、区域设置)的配置方法。涉及修改的文件涵盖 bootcd.ini、unattend.inf、setuplib.c、…

📅 2026/8/23 17:22:57
MORE NEWS

更多资讯

📰

网络学习:网络层与数据链路层知识梳理

一、网络层网络层的作用:用户要的是可靠传输,而网络层提供传输能力,传输层提供可靠性(TCP)。网络层传输机制:把数据交给目标网络,再由路由器转较给目标主机。1.IP报头介绍IP报头采用定长报头与自…

📰

亚太6D机载相控阵卫星链路预算(三)——南京地区前向10Mbps链路计算与余量

外场测试中,机载相控阵终端在特定姿态下突然出现前向业务速率骤降或信号失锁,排查后发现链路余量在波束边缘与姿态偏转叠加时已被压缩至1~2dB的临界区间——这正是高通量卫星(HTS)机载链路预算设计的典型痛点。 本文核…

📰

D2 v0.1.5 版本特性解析:Crow Foot 关系标记、SVG 自适应屏幕与 Dagre 布局优化

D2 v0.1.5 版本特性解析:Crow Foot 关系标记、SVG 自适应屏幕与 Dagre 布局优化 【免费下载链接】d2 D2 is a modern diagram scripting language that turns text to diagrams. 项目地址: https://gitcode.com/GitHub_Trending/d2/d2 本篇技术指南以 D2 项目…

📰

极化码在高斯信道下的CA-SCL译码:MATLAB实现与性能仿真

简介:这套Matlab代码包实现了极化码在高斯信道下的CA-SCL译码算法,面向通信工程、电子信息与数学等专业学生,可用于课程设计、期末大作业或毕业设计中的性能验证与算法对比。代码采用参数化编程,列表深度、信噪比等关键参数可灵活…

📰

OpenAI Agents SDK Realtime 智能体完全指南:会话生命周期、音频配置与电话集成实战

OpenAI Agents SDK Realtime 智能体完全指南:会话生命周期、音频配置与电话集成实战 【免费下载链接】openai-agents-python A lightweight, powerful framework for multi-agent workflows 项目地址: https://gitcode.com/GitHub_Trending/op/openai-agents-pyth…

📰

STM32F405ZG与AD5293数字电位器实现工业自动校准方案

做仪表、传感器变送器或者工业板卡的朋友,八成都有过半夜还在车间里拿螺丝刀拧电位器的经历。每个批次元器件都有离散性,每块板子都要单独校准,校准完还得担心机械电位器用久了氧化、振动导致阻值漂移。后来我把整个方案换成了数字电位器&…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬