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