我必须实现一个使用##的循环。

#define  REGISTER_EXPANSION_SIMPLE(erm_register,register_index)  erm_register##register_index.R

for(i=0;i<10;i++)
REGISTER_EXPANSION_SIMPLE(ERM.SR,i);


问题是,由于REGISTER_EXPANSION_SIMPLE将在预设阶段被替换,因此此时“ i”的值将未知,并且扩展将变为

ERM.SRi.R但我想要它ERM.SR1.R

请您能帮我解决问题。我知道这是一个逻辑错误。任何帮助将不胜感激。

最佳答案

您不能这样做,i是运行时变量,而不是编译时常量。

但是,假设寄存器位于相邻的存储单元中,您可以执行以下操作:

#define REGISTER_BASE  ((volatile uint8_t*)0x12345678) // uint8_t or uint32_t depending on reg size
#define REGISTER(n)    (*(REGISTER_BASE + n))

...

for(i=0; i<10; i++)
  REGISTER(i) = something;

关于c - 如何在C中使用##实现循环,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34218261/

10-11 19:53