#在C中定义一个元组
#define a tuple in C
我希望能够定义一个元组来表示其他宏所需的参数。
我认为展示我想要的东西的最好方法是展示一个例子:
#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
我遇到的问题与扩展顺序有关,并导致以下错误:
macro "OUTPUT" requires 3 arguments, but only 1 given
这适用于带有自定义构建硬件的 AVR 项目,我在其中定义了 LED
和其他具有相应 LED_PORT
LED_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
宏看到三个参数。
我希望能够定义一个元组来表示其他宏所需的参数。
我认为展示我想要的东西的最好方法是展示一个例子:
#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
我遇到的问题与扩展顺序有关,并导致以下错误:
macro "OUTPUT" requires 3 arguments, but only 1 given
这适用于带有自定义构建硬件的 AVR 项目,我在其中定义了 LED
和其他具有相应 LED_PORT
LED_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
宏看到三个参数。