flu*_*ngo 8 c avr c-preprocessor
我希望能够定义一个表示其他宏所需参数的元组.
我认为展示我想要的最好的方式是展示一个例子:
#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);
}
Run Code Online (Sandbox Code Playgroud)
我希望OUTPUT(LED)然后扩展到:
LED_DDR |= 1 << LED_PIN
Run Code Online (Sandbox Code Playgroud)
我得到的问题是扩展的顺序,并导致以下错误:
宏"OUTPUT"需要3个参数,但只有1个参数
这适用于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)
Run Code Online (Sandbox Code Playgroud)
在重新扫描期间,spec之前会扩展OUTPUT_I,因此OUTPUT_I宏会看到三个参数.