用未知数量的定义填充const数组

时间:2019-11-08 08:24:56

标签: c c-preprocessor

是否有更优雅的方法可以做到这一点:

#if   SCID_BASE
const uint32_t baseaddr[] = {SCIA_BASE, SCIB_BASE, SCIC_BASE, SCID_BASE};
#elif SCIC_BASE
const uint32_t baseaddr[] = {SCIA_BASE, SCIB_BASE, SCIC_BASE};
#elif SCIB_BASE
const uint32_t baseaddr[] = {SCIA_BASE, SCIB_BASE };
#else
const uint32_t baseaddr[] = {SCIA_BASE};
#endif

SCI_BASE是从我的程序和uint32_t值之外定义的

我在运行时需要基地址,但是这取决于平台的端口数量。

谢谢!

2 个答案:

答案 0 :(得分:2)

那这样的事情呢?

const uint32_t baseaddr[] = {
  SCIA_BASE,
#ifdef SCIB_BASE
  SCIB_BASE,
#ifdef SCIC_BASE
  SCIC_BASE,
#ifdef SCID_BASE
  SCID_BASE,
#endif
#endif
#endif
};

或者如果您不想关心mathinc #endif s:

const uint32_t baseaddr[] = {
  SCIA_BASE,
#ifdef SCIB_BASE
  SCIB_BASE,
#endif
#ifdef SCIC_BASE
  SCIC_BASE,
#endif
#ifdef SCID_BASE
  SCID_BASE,
#endif
};

如果获得新地址,这很容易扩展。只需在每个地址上再添加3行即可。

答案 1 :(得分:1)

一种更优雅的方法是在某些全局“ mcu.h”中执行类似的操作。

extern volatile const uint32_t SCI_PORTS; // number of supported ports

然后在“ mcu.c”中输入

#include "mcu.h"

#ifdef MCU_ABC_X
  volatile const uint32_t SCI_PORTS = 2; // allocated at fixed address
#elif MCU_ABC_Y
  volatile const uint32_t SCI_PORTS = 3; // allocated at fixed address
...
#endif

那么您的数组将始终为

#include "mcu.h"

const uint32_t baseaddr[] = {SCIA_BASE, SCIB_BASE, SCIC_BASE, SCID_BASE};

for(size_t i=0; i<SCI_PORTS; i++)
  send(baseaddr[i], "hello world");

您只能在该数组中使用SCI_PORTS个项目。这样就可以将SCI_PORTS放在EEPROM单元之类的固定地址,然后无论编译哪个MCU系列成员,都将获得相同的二进制文件。