在我的Arduinoc(cpp(代码中,我有这些宏来设置/清除寄存器x:的位y
#define SET(x,y) x |= (1 << y)
#define CLEAR(x,y) x &= ~(1<< y)
然后在几个地方我使用:
CLEAR(PORTB,7)
或
SET(PORTB,7)
我想将宏定义为PORTB,7,这样它只在头文件中出现一次,而不是在我的代码中出现。(我只展示了一个例子,但我的代码中有几个PORTx,N的组合(。
我试过了:
#define CLOCK PORTB,7
#define CLOCK_HIGH SET(CLOCK)
但它随后无法使用进行构建
error: macro "SET" requires 2 arguments, but only 1 given CLOCK_HIGH; delay(DELAY); CLOCK_LOW; delay(DELAY);
有办法做到这一点吗?
必须首先在内部展开宏。再过一遍。你的代码可能是这样的:
#define SET(x,y) do{ (x) |= (1u << (y)); }while(0)
#define CLEAR(x,y) do{ (x) &= ~(1u << (y)); }while(0)
#define HIGH(a) SET(a) // another empty pass, just forward
// the `a` is expanded and the second `SET` takes two arguments
// or better, but not fully compliant:
// #define HIGH(...) SET(__VA_ARGS__)
#define CLOCK PORTB, 7
#define CLOCK_HIGH() HIGH(CLOCK)
int main() {
int PORTB;
CLOCK_HIGH();
}
作为一种很好的衡量标准,研究宏陷阱和编写宏时的良好实践。。