如何用C预处理器从配置表生成代码?避免重复定义错误
用C预处理器实现无重复的缓冲区配置生成方案
核心思路:X-Macro技术
用X-Macro将所有缓冲区配置集中在一处,每个配置项仅定义一次,通过重定义宏来生成不同的代码产物(缓冲区、数组、宏)。
1. 定义唯一配置表
将所有缓冲区的名称、尺寸、内存区域属性集中定义在一个宏列表中,每个项仅写一次:
// 缓冲区配置表:每项格式为 BUFFER_ENTRY(名称, 尺寸, 内存区域属性) #define BUFFER_CONFIG_LIST \ BUFFER_ENTRY(TX_BUF, 256, __attribute__((section(".tx_ram")))) \ BUFFER_ENTRY(RX_BUF, 512, __attribute__((section(".rx_ram")))) \ BUFFER_ENTRY(LOG_BUF, 1024, __attribute__((section(".log_ram"))))
2. 生成独立内存分区的缓冲区
重定义BUFFER_ENTRY宏,直接生成带指定内存属性的缓冲区变量:
// 生成独立缓冲区(分配到配置指定的内存区域) #define BUFFER_ENTRY(name, size, attr) attr uint8_t name[size]; BUFFER_CONFIG_LIST #undef BUFFER_ENTRY
3. 生成缓冲区尺寸数组
再次重定义宏,生成存储所有缓冲区尺寸的数组:
// 生成尺寸数组 #define BUFFER_ENTRY(name, size, attr) size, const size_t buffer_sizes[] = { BUFFER_CONFIG_LIST }; #undef BUFFER_ENTRY
4. 生成缓冲区指针数组
重定义宏生成指向每个缓冲区的指针数组:
// 生成指针数组 #define BUFFER_ENTRY(name, size, attr) name, uint8_t* const buffer_ptrs[] = { BUFFER_CONFIG_LIST }; #undef BUFFER_ENTRY
5. 生成缓冲区项数宏
通过数组大小计算自动得到项数,无需手动维护:
// 自动计算缓冲区总项数 #define BUFFER_COUNT (sizeof(buffer_sizes) / sizeof(buffer_sizes[0]))
方案优势
- 所有配置信息仅在
BUFFER_CONFIG_LIST中定义一次,增删或修改配置只需调整这个列表,彻底避免重复定义的错误。 - 生成的所有代码(缓冲区、数组、宏)共享同一配置源,保证数据一致性。
- 内存区域属性可灵活定制,适配不同MCU或系统的内存分区需求。
内容的提问来源于stack exchange,提问作者arnschi
相关产品推荐
相关产品推荐

