当前位置: 首页 > news >正文

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.dtcms.com/a/166070.html

相关文章:

  • 近期汇报
  • Nginx 重写与重定向配置
  • Java架构师深度技术面试:从核心基础到分布式架构全解析
  • 深夜突发:OpenAI紧急修复GPT-4o“献媚”问题
  • 【教学类-102-21】蝴蝶三色图作品3——异型书蝴蝶“满格变形图”一页2图、一页4图
  • 【今日三题】kotori和气球(排列) / 走迷宫(BFS最短路) / 主持人调度(二)(贪心+优先级队列)
  • 开源项目实战学习之YOLO11:ultralytics-cfg-models-fastsam(九)
  • Go并发控制模式:基于Channel的实践与优化
  • ganesha-DBUS
  • 批量删除OpenStack实例
  • 在柯希霍夫积分法偏移成像中,消除数据采集和地下构造(如深浅孔径差异)导致的叠加次数不均匀会引起成像剖面强度差异
  • [特殊字符]适合五四青年节的SVG模版[特殊字符]
  • SpringMVC知识点总结(速查速记)
  • 【容器化】Linux环境Docker在线与离线安装手册
  • vue3 动态修改系统title
  • Nature子刊(IF=122.7)综述:自身免疫性疾病靶点的“进化史”
  • 中央网信办部署开展“清朗·整治AI技术滥用”专项行动
  • DeepSeek V1:初代模型的架构与性能
  • URP - 序列图动画的实现
  • 算法导论第6章思考题
  • Django 自定义celery-beat调度器,查询自定义表的Cron表达式进行任务调度
  • Transformer架构指南:从原理到实战资源全更新
  • AI中常用概念的理解
  • 格雷希尔用于工业气体充装站的CZ系列气罐充装转换连接器,其日常维护有哪些
  • 【学习笔记】Shell编程--Bash变量
  • 开源版禅道本地安装卸载备份迁移小白教程
  • “100% 成功的 PyTorch CUDA GPU 支持” 安装攻略
  • 一个完整的神经网络训练流程详解(附 PyTorch 示例)
  • pytorch的cuda版本依据nvcc --version与nvidia-smi
  • 6.1/Q1,浙江医院用NHANES:膳食中摄入黄酮类化合物有助于延缓生物衰老过程