You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过C宏自动生成lv_img_dsc_t图标结构体数组初始化代码?

自动生成静态数组初始化代码的C宏方案

现有如下C宏代码,已通过HEADER_SYMBOLS宏生成枚举值及外部lv_img_dsc_t结构体的引用:

#define HEADER_SYMBOLS(i)   \
    i(WIFI_BARS_0, IconWifiBars0)\
    i(WIFI_BARS_1, IconWifiBars1)\
    i(WIFI_BARS_2, IconWifiBars2)\
    i(WIFI_BARS_3, IconWifiBars3)\
    i(WIFI_BARS_FULL, IconWifiBarsFull)\

enum EnHeaderSymbols
{
#define CREATE_HEADERICON_ENUM(e,f)  SYMBOL_##e,
    HEADER_SYMBOLS(CREATE_HEADERICON_ENUM)
    NUM_HEADER_SYMBOLS
};

#define HEADER_SYMBOL_EXTERNS(e,f) extern const lv_img_dsc_t f;
HEADER_SYMBOLS(HEADER_SYMBOL_EXTERNS)

需求为自动生成静态数组static lv_img_dsc_t headerSymbolImages[NUM_HEADER_SYMBOLS] = { IconWifiBars0, IconWifiBars1 ... };的初始化代码,避免手动硬编码结构体名称。


实现方案

新增一个宏提取每个条目里的结构体名称,复用HEADER_SYMBOLS宏生成数组初始化列表,具体代码如下:

// 定义宏:提取条目第二个参数(结构体名称),生成数组元素项
#define CREATE_HEADERICON_ARRAY(e,f)  f,

// 自动生成静态数组
static const lv_img_dsc_t* headerSymbolImages[NUM_HEADER_SYMBOLS] = {
    HEADER_SYMBOLS(CREATE_HEADERICON_ARRAY)
};

说明:

  • CREATE_HEADERICON_ARRAY宏仅保留每个i(e,f)中的第二个参数f(即结构体名称),并添加逗号,完全符合C数组初始化的语法要求。
  • 调用HEADER_SYMBOLS(CREATE_HEADERICON_ARRAY)时,会将所有条目展开为对应的结构体名称列表,顺序与枚举值完全一致,避免手动维护可能出现的顺序错误。
  • 将数组元素类型设为const lv_img_dsc_t*更合理:原结构体为extern const声明,存储指针可避免不必要的结构体拷贝,同时保证类型匹配。若确需存储结构体实例,在结构体支持拷贝的前提下,可将类型改回lv_img_dsc_t。

内容的提问来源于stack exchange,提问作者AndyR

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 17:42:23