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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 17:57:12