如何在Cpp中定义一个包含两个令牌的宏



在我的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();
}

作为一种很好的衡量标准,研究宏陷阱和编写宏时的良好实践。。

相关内容

  • 没有找到相关文章

最新更新