#define C中的元组

时间:2015-04-27 13:48:33

标签: c c-preprocessor avr

我希望能够定义一个表示其他宏所需参数的元组。

我认为展示我想要的最好方法是展示一个例子:

#include <avr/io.h>

#define LED_PORT PORTB
#define LED_DDR  DDRB
#define LED_PIN  PB7
#define LED      LED_PORT, LED_DDR, LED_PIN

#define OUTPUT(port, ddr, pin) ddr |= 1 << pin

void main(void) {
    OUTPUT(LED);
}

我希望OUTPUT(LED)扩展为:

LED_DDR |= 1 << LED_PIN

我得到的问题是扩展顺序,并导致以下错误:

  

宏“OUTPUT”需要3个参数,但只有1个

这适用于带有自定义构建硬件的AVR项目,其中我已定义LED,其他组件分别具有LED_PORT LED_DDRLED_PIN

然后,我想要定义更多可以使用此LED的宏,并使用适当的参数以尽可能简洁的方式进行映射。

标准C预处理器可以实现吗?

1 个答案:

答案 0 :(得分:6)

您可以为宏添加一个间接级别来实现此目的:

#define OUTPUT_I(port, ddr, pin) ddr |= 1 << pin
#define OUTPUT(spec) OUTPUT_I(spec)

在重新扫描期间,spec会在OUTPUT_I之前展开,因此OUTPUT_I宏会看到三个参数。