GCC-C语言“自定义段”

一、起因

        事情的起因是这样的,在看别人代码时,发现了一种很有意思的写法,因为本人主要是以应用层开发为主,所以对这种写法还是比较少见的,所以研究了一下,就牵扯出了一些知识点,这里先卖个关子,继续往下看。

二、经过

        发现了一串这样的代码

static void do_mac(mcmd_t *mcmd, char *params)
{}
MIIO_CMD(mac, do_mac, NULL);

       这个是明显是串口数据的处理回调。进入MIIO_CMD看一下

#define MIIO_CMD_ADDON_NAME								cmd
#define MIIO_CMD(_name, _cmd, _tip)						\miio_addon_entry_complete(MIIO_CMD_ADDON_NAME, _name, _cmd, _tip, 0)

        这里面就是一个宏定义,再进入 miio_addon_entry_complete 看一下

#define miio_addon_entry_complete(_addon, _name, _value, _tip, _acm)	\miio_addon_entry_declare(_addon, _name) = miio_addon_value_complete(_addon, _name, _value, _tip, _acm)

        这里面调用了 miio_addon_value_complete 赋值给了 miio_addon_entry_declare

        先看 miio_addon_value_complete

#define __miio_addon_acm_assignment(_acm) , .acm = (_acm) & 0B11#define _miio_addon_value_complete(_addon, _name, _value, _tip, _acm){.name = #_name, .full_name = #_addon"."#_name, .value = _value, .tip = _tip __miio_addon_acm_assignment(_acm)}
#define miio_addon_value_complete(_addon, _name, _value, _tip, _acm)	_miio_addon_value_complete(_addon, _name, _value, _tip, _acm)

        这里面就是赋值,把入口参数赋值给结构体的各个元素

        这里介绍一个#参数,防止有些朋友不太懂。

        #是一个字符串化操作符。就是把参数转化为字符串。例如下面这段代码

#define TO_STR(s) #sint a = 123;
printf("%s",TO_STR(a));

        代码的含义就是把Int类型的变量a转化为字符串类型,并且输出

        好,言归正传。再看 miio_addon_entry_declare 参数

#define _miio_addon_entry_declare(_addon, _name)				\miio_addon_symbol_t _miio_addon_list_2_##_addon##_2_##_name	\__attribute__((aligned(4)))								\__attribute__((unused, section(".miio_addon_list_2_"#_addon"_2_"#_name)))
#define miio_addon_entry_declare(_addon, _name)			_miio_addon_entry_declare(_addon, _name)

        这里面有个 miio_addon_symbol_t 结构体,看一下

typedef struct miio_addon_symbol_s {const char* name;const char* full_name;void* value;const char* tip;const uint8_t acm;
}miio_addon_symbol_t;

        这里面的元素就是 miio_addon_value_complete 宏定义的赋值。

#define _miio_ad

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/81272.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【信息系统项目管理师-论文真题】2021上半年论文详解(包括解题思路和写作要点)

更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 试题1:论信息系统项目的合同管理1、写作要点2、解题思路项目合同管理的过程项目合同主要的条款内容试题2:论信息系统项目的范围管理1、写作要点2、解题思路项目范围管理的过程核心范围对应的需求跟踪矩阵项目…

python2反编译部分

文章目录 1、所需环境2、确认打包工具(没成功)3、 解包.exe文件(以PyInstaller为例) - useful【***总的来说这一步对我有用】4、定位关键文件 - useful5、 修复.pyc文件头(关键步骤!)- maybe-ig…

基于STM32的中点圆算法,画空心圆的函数

中点圆算法(Midpoint Circle Algorithm)是一种高效绘制圆的算法,它利用圆的对称性和整数运算来避免浮点计算,非常适合嵌入式系统使用。 空心圆绘制函数实现 /*** brief 使用中点圆算法绘制空心圆* param x0: 圆心x坐标* param y0: 圆心y坐标* param…

Android Kotlin 项目完整集成 Bugly 异常监控指南

Android Kotlin 项目集成 Bugly 异常监控完整指南 一、Bugly 简介 Bugly 是腾讯提供的专业移动应用异常监控平台,支持: 崩溃报告(Java/Native)错误分析性能监控热更新功能(需额外配置) 二、集成步骤 1…

【电脑维修】MERCURY水星无线网卡导致 Windows 网络适配器无法连接的一种情况

故障现象 Powershell 无法启动, Terminal 无法启动, CMD 无法启动。 操作1 重新拔插 MERCURY 无线USB网卡,上述各种终端恢复相应。 分析 应该是MERCURY驱动故障导致卡死 操作2 磁盘出现 MERCURY 盘。里面是一个 MERCURY.exe 驱动安装程…

Docker 打上 Tag 和 Push 的意思

在 Docker 中,打 Tag(Tagging) 和 Push(Pushing) 是两个关键操作,用于管理镜像的版本并上传到镜像仓库(如 Docker Hub、阿里云 ACR、Harbor 等)。 1. 打 Tag(Tagging&…

简化excel校验提高开发效率

业务背景:上传excel文件进行基础数据校验,然而东西太多写着写着就...自然成了测试的KPI了 解决思路:使用现有的注解处理,原理使用validate注解原理 直接上干货,一行代码搞定校验: ValidateUtils.validat…

基于Koa实现的服务端渲染 ✅

前段时间刚写完毕业论文,现在一上来就是“基于”,哈哈。🤯 这篇文章持续更新,涉及到的技术栈是Koa、Vue和Vite (用React手搓服务端渲染好麻烦)。但是现在能上生产的服务端渲染估计是Next(配合Re…

Linux运维——Vim基础

Vim基础 一、移动光标1.1、基础移动1.2、屏幕滚动 二、编辑操作2.1、插入模式2.2、删除与修改2.3、复制粘贴 三、搜索与替换3.1、搜索3.2、替换 4、分屏与窗口管理4.1、分屏操作4.2、窗口调整 五、宏与批量操作六、效率技巧七、操作符7.1、内置操作符7.2、操作符 文本对象&…

git操作合集

更新文件 在 Git 中更新已经上传到仓库的文件 1、检查当前状态 首先,打开终端或命令行工具,进入你的 Git 仓库目录(即包含 .git 文件夹的目录)。运行以下命令来查看当前仓库的状态: git status 此命令会显示哪些文…

【笔记】深度学习模型训练的 GPU 内存优化之旅⑤:内存分配篇

开设此专题,目的一是梳理文献,目的二是分享知识。因为笔者读研期间的研究方向是单卡上的显存优化,所以最初思考的专题名称是“显存突围:深度学习模型训练的 GPU 内存优化之旅”,英文缩写是 “MLSys_GPU_Memory_Opt”。…

SQL Server 存储过程开发手册

SQL Server 存储过程开发手册(更新版) 根据要求,重新整理并加入了事务控制、异常日志记录和返回状态码的设计。以下是详细说明: 1. 总则 1.1 目标 本手册旨在为 SQL Server 存储过程的编写提供一套完整的规范,确保系…

深海科技服务博客简介

人人可学,人人可用,IT与AI不是高不可攀! 博客宗旨 深海科技服务博客致力于: 推广IT与AI的实际应用,降低入门门槛,让更多个人和中小企业能够以最少投入、高效实现信息化、智能化。 分享开源免费软件、简单…

本地大模型编程实战(29)查询图数据库NEO4J(2)

上一篇文章 用大语言模型LLM查询图数据库NEO4J(1) 介绍了使用GraphQACypherChain查询NEO4J。用它实现简单快捷,但是不容易定制,在生产环境中可能会面临挑战。 本文将基于langgraph 框架,用LLM(大语言模型)查询图数据库NEO4J。它可以定义清晰复…

RPG_5.角色动画

1.创建一个动画实例 2.创建该实例的c子类 3.继续创建该类的子类,但是作用是用来链接(以后会详细解释) 4.基于PlayerAnimInstance类创建一个子类 5.目前一共创建了四个c类, 最基的类 角色的类 玩家控制的角色的类 玩家控制的角…

Sigmoid函数导数推导详解

Sigmoid函数导数推导详解 在逻辑回归中,Sigmoid函数的导数推导是一个关键步骤,它使得梯度下降算法能够高效地计算。 1. Sigmoid函数定义 首先回顾Sigmoid函数的定义: g ( z ) 1 1 e − z g(z) \frac{1}{1 e^{-z}} g(z)1e−z1​ 2. 导…

MS31860T——8 通道串行接口低边驱动器

MS31860T 是一款 8 通道低边驱动器,包含 SPI 串口通信、 PWM斩波器配置、过流保护、短路保护、欠压锁定和过热关断功能, 芯片可以读取每个通道的状态。MS31860T 可以诊断开路的负载情况,并可以读取故障信息。外部故障引脚指示芯片的故障状态。…

腾讯 Kuikly 正式开源,了解一下这个基于 Kotlin 的全平台框架

在 3月的时候通过 《腾讯 TDF 即将开源 Kuikly 跨端框架,Kotlin 支持全平台》 我们大致知道了 Kuikly 的基本情况,Kuikly 是一个面向终端技术栈的跨端开发框架,完全基于kotlin语言开发,提供原生的性能和体验。 按照官方的说法&…

AI驱动UI自动化测试框架调研

随着应用复杂度增加,手动测试变得费时且易出错,而自动化测试可提高效率和可靠性。如何借助大模型和一些自动化测试框架进行自动化测试,是一个研发团队很重要的诉求。 目前主流的自动化测试框架很多,Midscene.js结合Playwright提供…

关系型数据库设计指南

1. 前言 在自己独立开发一个项目的过程中,我发现了一些以往写小 Demo 从来没有遇到过的问题。 最近在独立制作一个全栈的通知管理平台。一开始我没有考虑太多,直接根据头脑中零星的想法就开撸后端数据库 model 和 API,用的是学了半成品的 M…