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

相关新闻

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

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

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

2026/10/15 23:37:04 阅读更多 →
【JVM调优实战】32-案例-高并发网关GC停顿优化

【JVM调优实战】32-案例-高并发网关GC停顿优化

案例:高并发网关的 GC 停顿优化 本文是《JVM调优实战》专栏第 32 讲。 引言 API 网关是所有流量的"守门人"。上游调用方设置了 200ms 超时,你的网关必须在极短时间内完成鉴权、路由、限流、协议转换。打个比方:网关就像超市的收银台,如果收银员偶尔"卡住&q…

2026/10/18 2:51:54 阅读更多 →
开源在线演示文稿工具全攻略:5分钟学会免费制作专业PPT

开源在线演示文稿工具全攻略:5分钟学会免费制作专业PPT

开源在线演示文稿工具全攻略:5分钟学会免费制作专业PPT 【免费下载链接】PPTist PowerPoint-ist(/pauəpɔintist/), An online presentation application that replicates most of the commonly used features of MS PowerPoint, allowing f…

2026/10/15 23:37:39 阅读更多 →

最新新闻

C# WebSocket实战:从握手到心跳重连的完整Demo解析

C# WebSocket实战:从握手到心跳重连的完整Demo解析

简介:这是一套面向C#开发者的WebSocket通信完整示例,适合需要实现实时双向通信、研究服务端与客户端交互逻辑的中高级程序员,也可作为ASP.NET项目集成WebSocket功能的参考。资源包内含客户端与服务端两个完整工程,共76个文件&…

2026/10/18 8:38:19 阅读更多 →
Spring Boot自动配置与Maven依赖管理:从原理到实战排查

Spring Boot自动配置与Maven依赖管理:从原理到实战排查

直接说结论:Spring Boot 最核心的“魔法”就是自动配置,而 Maven 则是支撑这一切运转的基石。很多人在项目里把依赖一引、启动类一写,应用就跑起来了,但一旦遇到版本冲突、配置失效或想自定义 Starter 时,就会卡住。这…

2026/10/18 8:38:19 阅读更多 →
投资者结构优化与市场波动率:实证检验与倒U型规律

投资者结构优化与市场波动率:实证检验与倒U型规律

这两年聊到市场波动,总绕不开一个词:投资者结构。几乎每次市场剧烈震荡之后,都会有人把原因归到散户太多、机构太少,顺手得出一个结论——结构优化了,市场自然就稳了。我刚接手这块研究时也差不多是这个直觉&#xff0…

2026/10/18 8:38:19 阅读更多 →
MFC中COleDispatchException异常处理实践:从错误码到自动化调用排坑

MFC中COleDispatchException异常处理实践:从错误码到自动化调用排坑

1. 从一个诡异的崩溃说起:OLE自动化异常到底是怎么回事先讲一个我实际遇到的场景。某项目里需要程序自动操作本机的一个ActiveX组件,往外部系统推送数据。功能跑起来倒是顺畅,但是运行到某个中间环节,程序突然弹出错误对话框——不…

2026/10/18 8:38:19 阅读更多 →
LangChain4j声明式Agent底层真相:动态代理与大模型函数回调

LangChain4j声明式Agent底层真相:动态代理与大模型函数回调

1. 声明式Agent:Java生态里被严重低估的“接口即服务”设计我用LangChain4j写过几个实际项目之后,最大的感受是:很多人在初学阶段就被AiServices那一套“接口定义Agent”的写法震住了,第一反应是“这不就是个注解处理器吗”。但如…

2026/10/18 8:38:19 阅读更多 →
对话式Linux运维Agent:高危操作强制确认与断线自动守候

对话式Linux运维Agent:高危操作强制确认与断线自动守候

长期在 Linux 运维一线干活的人都有过这种纠结时刻:一台线上服务器在手边,一条 rm -rf 敲下去,回车键一按,几秒钟可能就毁掉团队几个月的积累。做这个对话式 Linux 运维 Agent 的初衷很简单,我想让机器替我处理那些繁琐…

2026/10/18 8:37:18 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 0:55:02 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →