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

【C语言】宏定义中X-Micro的使用

C语言宏定义中X-Micro的使用

在LVGL源码中,全局变量初始化,以及函数声明和定义(LV_ROOTS)的时候的时候,使用到了X-Micro,下面拆解一下这个宏的用法。

下列代码来自:lv_gc.h 头文件

#define LV_DISPATCH(f, t, n)            f(t, n)

#define LV_ITERATE_ROOTS(f)                                                                            \
    LV_DISPATCH(f, lv_ll_t, _lv_timer_ll) /*Linked list to store the lv_timers*/                       \
    LV_DISPATCH(f, lv_ll_t, _lv_disp_ll)  /*Linked list of display device*/                            \
    LV_DISPATCH(f, lv_ll_t, _lv_indev_ll) /*Linked list of input device*/                              \
    LV_DISPATCH(f, lv_ll_t, _lv_fsdrv_ll)                                                              \
    LV_DISPATCH(f, lv_ll_t, _lv_anim_ll)                                                               \
    LV_DISPATCH(f, lv_ll_t, _lv_group_ll)                                                              \
    LV_DISPATCH(f, lv_ll_t, _lv_img_decoder_ll)                                                        \
    LV_DISPATCH(f, lv_ll_t, _lv_obj_style_trans_ll)                                                    \
    LV_DISPATCH(f, lv_layout_dsc_t *, _lv_layout_list)                                                 \
    LV_DISPATCH_COND(f, _lv_img_cache_entry_t*, _lv_img_cache_array, LV_IMG_CACHE_DEF, 1)              \
    LV_DISPATCH_COND(f, _lv_img_cache_entry_t, _lv_img_cache_single, LV_IMG_CACHE_DEF, 0)              \
    LV_DISPATCH(f, lv_timer_t*, _lv_timer_act)                                                         \
    LV_DISPATCH(f, lv_mem_buf_arr_t , lv_mem_buf)                                                      \
    LV_DISPATCH_COND(f, _lv_draw_mask_radius_circle_dsc_arr_t , _lv_circle_cache, LV_DRAW_COMPLEX, 1)  \
    LV_DISPATCH_COND(f, _lv_draw_mask_saved_arr_t , _lv_draw_mask_list, LV_DRAW_COMPLEX, 1)            \
    LV_DISPATCH(f, void * , _lv_theme_default_styles)                                                  \
    LV_DISPATCH(f, void * , _lv_theme_basic_styles)                                                  \
    LV_DISPATCH_COND(f, uint8_t *, _lv_font_decompr_buf, LV_USE_FONT_COMPRESSED, 1)                    \
    LV_DISPATCH(f, uint8_t * , _lv_grad_cache_mem)

#define LV_DEFINE_ROOT(root_type, root_name) root_type root_name;
#define LV_ROOTS LV_ITERATE_ROOTS(LV_DEFINE_ROOT)

#define LV_GC_ROOT(x) x
#define LV_EXTERN_ROOT(root_type, root_name) extern root_type root_name;
LV_ITERATE_ROOTS(LV_EXTERN_ROOT)

在LVGL中,调用 LV_ROOTS 宏声明全局变量,下面拆解宏,宏的拆解从内到外,由于前面

#define LV_DISPATCH(f, t, n)            f(t, n)
#define LV_ITERATE_ROOTS(f)                                                               \
    f(lv_ll_t, _lv_timer_ll) /*Linked list to store the lv_timers*/                       \
    f(lv_ll_t, _lv_disp_ll)  /*Linked list of display device*/                            \
    f(lv_ll_t, _lv_indev_ll) /*Linked list of input device*/ 
    ...... // 其余省略

根据这条宏定义:

LV_DEFINE_ROOT(root_type, root_name) root_type root_name;

把 f 替换为 LV_DEFINE_ROOT,因此就变为:

#define LV_ITERATE_ROOTS(LV_DEFINE_ROOT)                                                               \
    LV_DEFINE_ROOT(lv_ll_t, _lv_timer_ll) /*Linked list to store the lv_timers*/                       \
    LV_DEFINE_ROOT(lv_ll_t, _lv_disp_ll)  /*Linked list of display device*/                            \
    LV_DEFINE_ROOT(lv_ll_t, _lv_indev_ll) /*Linked list of input device*/ 
    ...... // 其余省略

LV_DEFINE_ROOT(lv_ll_t, _lv_timer_ll)

展开之后便是:

lv_ll_t  _lv_timer_ll;

其他的同理,因此这里就对全局链表进行了声明;

如果要把全局变量属性设置为extern,给外部文件使用,只需要修改一下宏,改为下面这种形式,只需要修改一下 宏定义,就可以完成所有全局变量的声明:

#define LV_EXTERN_ROOT(root_type, root_name) extern root_type root_name;
LV_ITERATE_ROOTS(LV_EXTERN_ROOT)

总结:

使用 X-Macro 宏集中管理全局变量,减少代码更简洁,同时提升代码可维护性;

相关文章:

  • PAT乙级真题 / 知识点(2)
  • React Native v0.78 更新
  • 基于Asp.net的零食购物商城网站
  • Java多线程与高并发专题——ConcurrentHahMap 在 Java7 和 8 有何不同?
  • AIGC(生成式AI)试用 26 -- 跟着清华教程学习 - 个人理解
  • 微服务通信:用gRPC + Protobuf 构建高效API
  • java面试项目介绍,详细说明
  • 如何同步this.goodAllData里面的每一项给到row
  • 基于PyTorch的深度学习3——基于autograd的反向传播
  • 为AI聊天工具添加一个知识系统 之136 详细设计之77 通用编程语言 之7
  • MARL零样本协调之Fictitious Co-Play学习笔记
  • Python练习(握手问题,进制转换,日期问题,位运算,求和)
  • 数据流图(实例)
  • 【ArcGIS/GeoScene Server】修改密码
  • 颈椎X光数据集(cervical spine X-ray dataset)
  • MySQL 数据库连接池爆满问题排查与解决
  • 数据挖掘校招面经二
  • 爬虫面试:关于爬虫破解验证码的13个经典面试题
  • c++类继承的一些反思
  • C++ 测试案例
  • 品牌建设有效提升城市竞争力例子/百度seo和sem的区别
  • 做视频网站的备案要求/免费b站推广网站不
  • 做网站先学什么/网页模板之家
  • 做网站开发学什么内容/360优化大师最新版的功能
  • 免费搭建网站 优帮云/长沙seo报价
  • 响应式网站一般做几个尺寸/百度平台商家联系方式