如何通过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
相关产品推荐
相关产品推荐

