我有一个描述一组地址的#define列表:
#define DMA1_Stream0 ((DMA_Stream_TypeDef *) DMA1_Stream0_BASE)
#define DMA1_Stream1 ((DMA_Stream_TypeDef *) DMA1_Stream1_BASE)
#define DMA1_Stream2 ((DMA_Stream_TypeDef *) DMA1_Stream2_BASE)
#define DMA1_Stream3 ((DMA_Stream_TypeDef *) DMA1_Stream3_BASE)
(这是来自CMSIS标题) 和一个应该使用其中一个的函数,具体取决于给定的参数,如:
void initDMAStream(uint8_t controller, uint8_t stream)
{
DMA[controller]_Stream[stream]->CR = 0xdadadada;
// etc...
}
我尝试使用像
这样的宏#define DMA_STREAM(c, s) DMA ## c ## _Stream ## s
但它无法正常工作,因为它会将c
和s
替换为函数参数的名称,而不是其值。
有没有办法在C中执行此操作?
答案 0 :(得分:1)
看起来您正试图以不合理的方式混合运行时和编译时评估。特别是,您正在尝试在编译时使用运行时信息。
您可以通过将编译时常量抛出到数组中并在运行时将其编入索引来实现此功能。例如,将数组设置为
DMA_Stream_TypeDef * DMAstreams[][4] = {
{DMA0_Stream0, DMA0_Stream1, DMA0_Stream2, DMA0_Stream3},
{DMA1_Stream0, DMA1_Stream1, DMA1_Stream2, DMA1_Stream3},
// ...
};
并使用
访问它DMAstreams[controller][stream]
在运行时。