首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用预处理宏实现小方差的C代码重复

用预处理宏实现小方差的C代码重复
EN

Stack Overflow用户
提问于 2016-04-23 15:39:45
回答 1查看 63关注 0票数 0

我目前正在为一个微处理器家族开发一些外围驱动程序。我需要为非常类似的设备编写代码,在某些情况下,这些设备的外设数量不同。

我想为UART外围设备编写一个驱动程序,但是在家庭的一些设备中,只有一个可用,而对于其他设备,只有两个。UART2 y的驱动程序与UART1的驱动程序相同,但不是写入UART1FOO寄存器,而是需要写入UART2FOO寄存器。知道了这一点,我想编写一段代码,其中宏可以重复一大块代码,但是可以替换寄存器引用的数量。

理想的解决办法是:

代码语言:javascript
复制
// File: uartdriver.h

#if __device1__
#define PRESENT_UARTS 1
#else
#define PRESENT_UARTS 2
#endif

#for CURRENT_ITEM in MAGIC_MACRO_THAT_RETURNS_LIST(PRESENT_UARTS)

  void uart#CURRENT_ITEM#_init();

#endfor

我知道这个伪代码并不存在,但我也看到人们使用宏进行魔术。我必须使用C代码,而不是C++,我知道宏的使用可能不是最友好的方式,但我不喜欢用这么小的变体重复代码。

模仿上述伪码的最佳解决方案是什么?还有其他提示或建议吗?在这种情况下,除了宏,还有其他替代方法吗?

非常感谢你抽出时间。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-23 16:39:08

我认为有些人在提出类似的建议。注意,这是伪代码(我刚刚输入了它,但没有进行测试,所以它可能有一些错误等等)。

代码语言:javascript
复制
typedef uint8_t uart_id; 
int uart_init(uart_id id, uint16_t baudrate);

typedef struct uart_definitions  {
  uart_id  id;
  uint16_t baudrate;
  ....
} udefs;

#define MAX_UDEFS 2
static udefs u_config[MAX_UDEFS] = {
    {0, 1000},
    {1, 8192}
};

uart_init(uart_id id, uint16_t brate) {
   assert(id <= MAX_UDEFS);
   u_config[id].baudrate = brate;
   .....
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36812841

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档