在#define宏中区分变量和常量

时间:2015-05-09 21:30:29

标签: c gcc macros avr

我有这样的宏:

#define _DDR_0  DDRD
#define _DDR_1  DDRD
#define _DDR_2  DDRD
// ....

#define _PN_0  0
#define _PN_1  1
#define _PN_2  2
// ...

/** Configure pin as output */
#define as_output(pin)   sbi(_DDR_##pin, _PN_##pin)
void    as_output_n(const uint8_t pin);

它的用法如下:

as_output(2);

uint8_t b = 1;
as_output_n(b);

_n变量用于变量,常量的宏(因为使用宏执行此操作要快得多)。

是否有任何可能的方法来使它始终使用as_output,并且根据它是常量还是变量,使用宏或函数?

1 个答案:

答案 0 :(得分:2)

宏由预处理器扩展,它不知道代码的作用。从预处理器的角度来看,所有宏参数都只是标记(没有逻辑意义)。在这种情况下,as_output宏用于制作新代码(通过令牌粘贴)。

所以,你正在尝试做的事情,不可能只使用宏(如果b本身就是一个宏,可能会有一种方法,但我想这不是你想要的)。

您可以为您的_DDR*PN*值以及内联函数而不是宏使用const数组。