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

我认为显示我想要的内容的最佳方法是显示一个示例:

#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

我遇到的问题与扩展顺序有关,并导致以下错误:



这用于具有自定义构建硬件的AVR项目,在该项目中,我已使用各自的LED LED_PORTLED_DDR定义了LED_PIN和其他组件。

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

使用标准C预处理器可以做到这一点吗?

最佳答案

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

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

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

关于c - #在C中定义一个元组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29897637/

10-11 23:10
查看更多