当前位置: 首页 > 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

相关文章:

  • 近期汇报
  • 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章思考题
  • 居委业委居民群策群力,7位一级演员来到上海一小区唱戏
  • 首部关于民营经济发展的基础性法律,有何亮点?专家解读
  • 五一去哪儿|外国朋友来中国,“买买买”成为跨境旅游新趋势
  • 科学家为AI模型设置“防火墙”,以防止被不法分子滥用
  • 辽宁省委书记、省长连夜赶赴辽阳市白塔区火灾事故现场,指导善后处置工作
  • 中国农业国际交流协会会长王守聪失联已逾半年,协会启动罢免