我必须实现一个使用##的循环。
#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/